为了账号安全,请及时绑定邮箱和手机立即绑定

从程序内部调用gdb以打印其stacktrace的最佳方法?

从程序内部调用gdb以打印其stacktrace的最佳方法?

富国沪深 2019-11-22 14:24:29
使用这样的函数:#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快得多(也许不那么松懈),因此它们有自己的位置。


查看完整回答
反对 回复 2019-11-22
  • 3 回答
  • 0 关注
  • 897 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信