使用这样的函数:#include <stdio.h>#include <stdlib.h>#include <sys/wait.h>#include <unistd.h>void print_trace() { char pid_buf[30]; sprintf(pid_buf, "--pid=%d", getpid()); char name_buf[512]; name_buf[readlink("/proc/self/exe", name_buf, 511)]=0; int child_pid = fork(); if (!child_pid) { dup2(2,1); // redirect output to stderr fprintf(stdout,"stack trace for %s pid=%s\n",name_buf,pid_buf); execlp("gdb", "gdb", "--batch", "-n", "-ex", "thread", "-ex", "bt", name_buf, pid_buf, NULL); abort(); /* If gdb failed to start */ } else { waitpid(child_pid,NULL,0); }}我在输出中看到了print_trace的详细信息。还有什么其他方法可以做到呢?
3 回答
HUWWW
TA贡献1874条经验 获得超12个赞
如果您使用的是Linux,则标准C库包括一个名为的函数backtrace,该函数用帧的返回地址填充一个数组,以及另一个名为的函数backtrace_symbols,该函数将从中获取地址backtrace并查找相应的函数名。这些记录在GNU C库手册中。
这些不会显示参数值,源代码行等,它们仅适用于调用线程。但是,它们应该比以这种方式运行GDB快得多(也许不那么松懈),因此它们有自己的位置。
- 3 回答
- 0 关注
- 897 浏览
添加回答
举报
0/150
提交
取消