print stack...

C

call_me_anything

Here is a code to have a debug printf :

#ifdef DEBUG
#define DEBUG_printf(...)
{printf("[%s]:",__FUNCTION__);printf(__VA_ARGS__);printf("\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 help 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)
 
R

red floyd

call_me_anything said:
Here is a code to have a debug printf :

#ifdef DEBUG
#define DEBUG_printf(...)
{printf("[%s]:",__FUNCTION__);printf(__VA_ARGS__);printf("\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 help 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::eek:stream& dump(std::eek: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();

}
 
G

Gianni Mariani

call_me_anything said:
Here is a code to have a debug printf :

#ifdef DEBUG
#define DEBUG_printf(...)
{printf("[%s]:",__FUNCTION__);printf(__VA_ARGS__);printf("\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 help 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.
 
J

James Kanze

Here is a code to have a debug printf :
#ifdef DEBUG
#define DEBUG_printf(...)
{printf("[%s]:",__FUNCTION__);printf(__VA_ARGS__);printf("\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 help 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.)
 
J

James Kanze

call_me_anything wrote:

[...]
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::eek:stream& dump(std::eek: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.
 
R

red floyd

James said:
call_me_anything wrote:
[...]
Is there something similar, which can print the current stack ?
I mean some C/C++ API which can help 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++... :).
 
J

James Kanze

James said:
call_me_anything wrote:
[...]
Is there something similar, which can print the current stack ?
I mean some C/C++ API which can help 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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,780
Messages
2,569,611
Members
45,281
Latest member
Pedroaciny

Latest Threads

Top