mirror of
https://gitlab.kitware.com/cmake/cmake.git
synced 2026-09-25 04:09:36 +03:00
This is to avoid (a future version of) Qt from having to wrap FindBacktrace like [1]. [1] https://code.qt.io/cgit/qt/qtbase.git/tree/cmake/FindWrapBacktrace.cmake
54 lines
1005 B
C
54 lines
1005 B
C
/* This is the code from `man backtrace_symbols`, reformatted, and without
|
|
* requiring a command-line argument */
|
|
|
|
#include <execinfo.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
|
|
#define BT_BUF_SIZE 100
|
|
|
|
void myfunc3(void)
|
|
{
|
|
int nptrs;
|
|
void* buffer[BT_BUF_SIZE];
|
|
char** strings;
|
|
|
|
nptrs = backtrace(buffer, BT_BUF_SIZE);
|
|
printf("backtrace() returned %d addresses\n", nptrs);
|
|
|
|
/* The call backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO)
|
|
would produce similar output to the following: */
|
|
|
|
strings = backtrace_symbols(buffer, nptrs);
|
|
if (strings == NULL) {
|
|
perror("backtrace_symbols");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
for (size_t j = 0; j < nptrs; j++)
|
|
printf("%s\n", strings[j]);
|
|
|
|
free(strings);
|
|
}
|
|
|
|
static void /* "static" means don't export the symbol... */
|
|
myfunc2(void)
|
|
{
|
|
myfunc3();
|
|
}
|
|
|
|
void myfunc(int ncalls)
|
|
{
|
|
if (ncalls > 1)
|
|
myfunc(ncalls - 1);
|
|
else
|
|
myfunc2();
|
|
}
|
|
|
|
int main(int argc, char* argv[])
|
|
{
|
|
myfunc(5);
|
|
exit(EXIT_SUCCESS);
|
|
}
|