I need to modify existing C app and print stacktrace at certain place. How can I do this?
I can’t compile this source:
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#ifndef __USE_GNU
#define __USE_GNU
#endif
#include <execinfo.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ucontext.h>
#include <unistd.h>
int main(int argc, char ** argv)
{
void * array[50];
void * caller_address;
char ** messages;
int size = backtrace(array, 50);
/* overwrite sigaction with caller's address */
array[1] = caller_address;
messages = backtrace_symbols(array, size);
/* skip first stack frame (points here) */
for (int i = 1; i < size && messages != NULL; ++i)
{
fprintf(stderr, "[bt]: (%d) %s\n", i, messages[i]);
}
free(messages);
}
because it lacks some symbols:
$ i586-mingw32msvc-gcc -rdynamic ./trace.cpp -I/usr/include/
i586-mingw32msvc-gcc: unrecognized option '-rdynamic'
./trace.cpp:39:2: warning: no newline at end of file
/tmp/cc6hCJtU.o:trace.cpp:(.text+0x26): undefined reference to `_backtrace'
/tmp/cc6hCJtU.o:trace.cpp:(.text+0x47): undefined reference to `_backtrace_symbols'
/tmp/cc6hCJtU.o:trace.cpp:(.text+0x67): undefined reference to `_stderr'
I didn’t manage to file proper .a file.
Following answers, that can be found here on stackoverflow are practically unusable:
- libunwind causes compile error during crosscompiling: error: ucontext.h: No such file or directory
- http://www.codeproject.com/Articles/11132/Walking-the-callstack doesn’t compile in MinGW
- http://www.mr-edd.co.uk/code/dbg also doesn’t compile
- http://www.mr-edd.co.uk/code/stack_trace also doesn’t compile and has errors
Is there any working solution? Thanks alot in advance.
Your MinGW toolchain doesn’t have support for the -rdynamic flag and cannot compile your application using
backtrace()orbacktrace_symbols()Not sure what MinGW you are using but I would recommend getting a fresh one from here: http://mingw-w64.sourceforge.net/