|
|
|
#1 |
|
Messages: n/a
Hébergeur: |
Here is a code to have a debug printf :
#ifdef DEBUG #define DEBUG_printf(...) {printf("[%s]:",__FUNCTION__) rintf(__VA_ARGS__) rintf("\n"); }#else #define DEBUG #endif int main () { DEBUG_printf ("%d %s", 5, "abc"); } Is there something similar, which can print the current stack ? I mean some C/C++ API which can me get any info related to the current stack of functions. Thats is required for debugging. (Please do not suggest gdb... I want something similar to gdb stack traces but that should print stack info everytime I compile with DEBUG on) |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
call_me_anything wrote:
> Here is a code to have a debug printf : > > #ifdef DEBUG > #define DEBUG_printf(...) > {printf("[%s]:",__FUNCTION__) rintf(__VA_ARGS__) rintf("\n"); }> #else > #define DEBUG > #endif > > int main () { > DEBUG_printf ("%d %s", 5, "abc"); > } > > Is there something similar, which can print the current stack ? > I mean some C/C++ API which can me get any info related to the > current stack of functions. > Thats is required for debugging. > (Please do not suggest gdb... I want something similar to gdb stack > traces but that should print stack info everytime I compile with DEBUG > on) > Not built in, but it's fairly easy to add: #include <ostream> class stack_tracer { public: stack_tracer(const char *where) : where_(where), next_(top()) { top() = this; } ~stack_tracer() { top() = next_; } static std: stream& dump(std: stream& os){ for (stack_tracer* curr = top(); curr != NULL; curr = curr->next_) { os << curr->where_ << '\n'; } return os; } private: static stack_tracer*& top() { static stack_tracer* top_ = 0; return top_; } stack_tracer *next_; const char *where_; }; #define TRACE3(mark, ln, txt) stack_tracer mark ## ln ## _(txt) #define TRACE2(ln, txt) TRACE3(st_, ln , txt) #define TRACE(txt) TRACE2(__LINE__,txt) #include <iostream> int f() { TRACE("f"); if (true) { TRACE("If block in f()"); stack_tracer::dump(std::cout) << std::endl; } } int main() { TRACE("main"); stack_tracer::dump(std::cout) << std::endl; f(); } |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
call_me_anything wrote:
> Here is a code to have a debug printf : > > #ifdef DEBUG > #define DEBUG_printf(...) > {printf("[%s]:",__FUNCTION__) rintf(__VA_ARGS__) rintf("\n"); }> #else > #define DEBUG > #endif > > int main () { > DEBUG_printf ("%d %s", 5, "abc"); > } > > Is there something similar, which can print the current stack ? > I mean some C/C++ API which can me get any info related to the > current stack of functions. > Thats is required for debugging. > (Please do not suggest gdb... I want something similar to gdb stack > traces but that should print stack info everytime I compile with DEBUG > on) There are platform specific mechanisms that allow you to get a stack trace. The Austria C++ "netcabletv" alpha contains a stack trace API that works on win32 and linux. |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
On Oct 16, 7:55 pm, call_me_anything <sgiitne...@gmail.com> wrote:
> Here is a code to have a debug printf : > #ifdef DEBUG > #define DEBUG_printf(...) > {printf("[%s]:",__FUNCTION__) rintf(__VA_ARGS__) rintf("\n"); }> #else > #define DEBUG > #endif > int main () { > DEBUG_printf ("%d %s", 5, "abc"); > } > Is there something similar, which can print the current stack ? > I mean some C/C++ API which can me get any info related to the > current stack of functions. > Thats is required for debugging. > (Please do not suggest gdb... I want something similar to gdb stack > traces but that should print stack info everytime I compile with DEBUG > on) Nothing standard. In fact, any solution will be very platform dependent. (My site has a stack trace class with implementations for i80x86, 64 bit AMD, and 32 and 64 bit Sparcs. But you still have to pay attention---changing the compiler options can change it as well. Still, it might be a start.) -- James Kanze (GABI Software) email:james.kanze@gmail.com Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 |
|
|
|
#5 |
|
Messages: n/a
Hébergeur: |
On Oct 16, 8:20 pm, red floyd <no.s...@here.dude> wrote:
> call_me_anything wrote: [...] > > Is there something similar, which can print the current stack ? > > I mean some C/C++ API which can me get any info related to the > > current stack of functions. > > Thats is required for debugging. > > (Please do not suggest gdb... I want something similar to gdb stack > > traces but that should print stack info everytime I compile with DEBUG > > on) > Not built in, but it's fairly easy to add: For what platform? Which compiler? What compile options? It's very, very implementation dependent. > #include <ostream> > class stack_tracer > { > public: > stack_tracer(const char *where) : where_(where), next_(top()) > { > top() = this; > } > ~stack_tracer() > { > top() = next_; > } > static std: stream& dump(std: stream& os)> { > for (stack_tracer* curr = top(); > curr != NULL; > curr = curr->next_) > { > os << curr->where_ << '\n'; > } > return os; > } > private: > static stack_tracer*& top() > { > static stack_tracer* top_ = 0; > return top_; > } > stack_tracer *next_; > const char *where_; > }; > #define TRACE3(mark, ln, txt) stack_tracer mark ## ln ## _(txt) > #define TRACE2(ln, txt) TRACE3(st_, ln , txt) > #define TRACE(txt) TRACE2(__LINE__,txt) > #include <iostream> > int f() > { > TRACE("f"); > if (true) > { > TRACE("If block in f()"); > stack_tracer::dump(std::cout) << std::endl; > } > } > int main() > { > TRACE("main"); > stack_tracer::dump(std::cout) << std::endl; > f(); > } Your implementation has two major problems: it requires that every function use the TRACE macro, it skips functions which don't use the macro; and it fails radically in a multi-thread environment. -- James Kanze (GABI Software) email:james.kanze@gmail.com Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 |
|
|
|
#6 |
|
Messages: n/a
Hébergeur: |
James Kanze wrote:
> On Oct 16, 8:20 pm, red floyd <no.s...@here.dude> wrote: >> call_me_anything wrote: > > [...] >>> Is there something similar, which can print the current stack ? >>> I mean some C/C++ API which can me get any info related to the >>> current stack of functions. >>> Thats is required for debugging. >>> (Please do not suggest gdb... I want something similar to gdb stack >>> traces but that should print stack info everytime I compile with DEBUG >>> on) >[redacted] > Your implementation has two major problems: it requires that > every function use the TRACE macro, it skips functions which > don't use the macro; and it fails radically in a multi-thread > environment. > 1. You're right, it does require the TRACE macro and skips those that don't. 2. You're right. I wrote the original version years ago in a single threaded environment. However, if I *really* wanted to be pedantic, I'd note that multithreaded environments are OT in comp.lang.c++... :-). |
|
|
|
#7 |
|
Messages: n/a
Hébergeur: |
On Oct 17, 8:56 am, red floyd <no.s...@here.dude> wrote:
> James Kanze wrote: > > On Oct 16, 8:20 pm, red floyd <no.s...@here.dude> wrote: > >> call_me_anything wrote: > > [...] > >>> Is there something similar, which can print the current stack ? > >>> I mean some C/C++ API which can me get any info related to the > >>> current stack of functions. > >>> Thats is required for debugging. > >>> (Please do not suggest gdb... I want something similar to gdb stack > >>> traces but that should print stack info everytime I compile with DEBUG > >>> on) > >[redacted] > > Your implementation has two major problems: it requires that > > every function use the TRACE macro, it skips functions which > > don't use the macro; and it fails radically in a multi-thread > > environment. > 1. You're right, it does require the TRACE macro and skips > those that don't. > 2. You're right. I wrote the original version years ago in a > single threaded environment. However, if I *really* wanted to > be pedantic, I'd note that multithreaded environments are OT > in comp.lang.c++... :-). Neither of which, of course, means that it isn't useful. As long as you know and understand its limitations. It's a lot, lot simpler than the stack walkback that I use, which requires a new implementation for every platform. -- James Kanze (GABI Software) email:james.kanze@gmail.com Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 |
|
![]() |
| Outils de la discussion | |
|
|