backtrace_symbols的实现需要符号名称的支持,编译时,需要加上-rdynamic选项。 代码如下: // backtrace.c#include<stdio.h>#include<execinfo.h>#include<stdlib.h>#include<unistd.h>using namespacestd;voidmyfunc3(){intj, nptrs;#defineSIZE 128void*buffer[100];char**strings; nptrs = backtrace(buffer, S...
intsize);/* Return names of functions from the backtrace list in ARRAY in a newlymalloc()ed memory block. */char**backtrace_symbols(void*const*array,intsize);/* This function is similar to backtrace_symbols
backtrace刚调用完就要调用backtrace_symbols把函数的地址转换为字符串二维数组,backtrace的第二个参数要大小合适,如果实际的调用栈有10层,大小却只赋值了5层,那么就只能显示调用栈从顶部开始的5层,这会错失一些底层的调用信息。如图所示 backtrace_symbols函数把转换好的二维字符串数组作为返回值返回,数组是在函数里面分配...
下面是一个示例程序,展示了如何在Linux中打印堆栈跟踪: #include<stdio.h>#include<stdlib.h>#include<execinfo.h>voidprintStackTrace(){void*stackTrace[100];intstackTraceSize=backtrace(stackTrace,sizeof(stackTrace)/sizeof(void*));char**stackTraceSymbols=backtrace_symbols(stackTrace,stackTraceSize);if(stackTra...
backtrace的实现依赖于栈指针(fp寄存器),在gcc编译过程中任何非零的优化等级(-On参数)或加入了栈指针优化参数-fomit-frame-pointer后多将不能正确得到程序栈信息; backtrace_symbols的实现需要符号名称的支持,在gcc编译过程中需要加入-rdynamic参数; 内联函数没有栈帧,它在编译过程中被展开在调用的位置; 尾调用优化...
backtrace_symbols将从backtrace函数获取的信息转化为一个字符串数组. 参数buffer应该是从backtrace函数获取的数组指针,size是该数组中的元素个数(backtrace的返回值),函数返回值是一个指向字符串数组的指针,它的大小同buffer相同.每个字符串包含了一个相对于buffer中对应元素的可打印信息.它包括函数名,函数的偏移地址,和...
在main函数中,我们首先调用了func1,然后通过backtrace函数获取函数调用栈信息,并通过backtrace_symbols函数将其打印出来。运行程序后,可以看到打印出了函数调用栈信息。 2. 示例二:使用backtrace获取函数调用栈信息并保存到文件中 ```c #include <stdio.h> #include <execinfo.h> void save_backtrace() { void *...
size = backtrace(buffer, 30); fprintf(stdout, "Obtained %zd stack frames.nm\n", size); strings = backtrace_symbols(buffer, size); if (strings == NULL) { perror("backtrace_symbols."); exit(EXIT_FAILURE); } for (i = 0; i < size; i++) ...
backtrace()函数可以通过以下步骤来使用: 在代码中包含头文件<execinfo.h>。 在程序崩溃的地方调用backtrace()函数,将调用栈信息保存到一个指针数组中。 使用backtrace_symbols()函数将调用栈信息转换为可读的字符串数组。 遍历字符串数组,打印出每个函数调用栈的信息。
backtrace_symbols_fd(array, size, fd); close(fd); #endif exit(0); } void die() { char *str1; char *str2; char *str3; char *str4 = NULL; strcpy(str4, "ab"); } void let_it_die() { die(); } int main(int argc, char **argv){ ...