* Dave Anderson [2008-05-13 15:16]: > > A few questions on this one... > > Do you know if this works OK on ia64, s390 and s390x? I made a test program (attached) and attached the result on all architectures. In fact, s390 and s390x produced even 100 % correct backtraces when the program was optimised with -O2. All other architectures leave out frames in that case, but I think that's limitation when frame pointers are omitted that is impossible to work around. > Compiling with warnings turned on yields: > > defs.h:1804: warning: implicit declaration of function ‘backtrace’ I forgot the <execinfo.h> include. > I haven't looked at the glibc sources, but I'm presuming it's > a "void backtrace(int)". Indeed, it's int backtrace(void **buffer, int size). In my patch I ignored the return value. The new patch (attached) corrects that mistake. I'm not sure if it's necessary to zero out the rest since the memory already was initialised with 0, but to be on the save side I think it's not bad to do it. Since sizeof(unsigned long) == sizeof(void *) on all architectures crash supports, the "wrong" type of buffer should be ok. In fact, __builtin_return_address() returns also an address, i.e. void * and not a long. Conforming strictly to C99, we should use uintptr_t. I don't know what the crash programming guide lines say, i.e. how old the compiler can be where crash is used. I think we should not introduce a C99 requirement because of that small patch here. A few words on the test program: I used backtrace_symbols_fd() to print out the backtrace here because I was too lazy to "port" the crash nm magic to the test program. However, the program needs to be compiled with -rdynamic to make that work. That's also documented in backtrace(3) manual page. So for crash, the nm magic is a big "ugly" but it works better than the backtrace_symbols_fd() here. But for the test program I was only interesting in the values backtrace() produces, not in resolving, so I think that should be ok. Bernhard
#include <stdio.h> #include <execinfo.h> void __attribute__((noinline)) dump_stack(void) { void *buffer[5]; int backtrace_ret; int i; char **backtr; backtrace_ret = backtrace(buffer, 5); backtrace_symbols_fd(buffer, backtrace_ret, 0); } void __attribute__((noinline)) fourth_function(void) { dump_stack(); } void __attribute__((noinline)) third_function(void) { fourth_function(); } void __attribute__((noinline)) second_function(void) { third_function(); } void __attribute__((__noinline__)) first_function(void) { second_function(); } int main(int argc, char *argv[]) { first_function(); return 0; }
Attachment:
results
Description: Binary data
Attachment:
crash-builtin-return-addr
Description: Binary data
-- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/crash-utility