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

使用这样的函数:


#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的详细信息。


还有什么其他方法可以做到呢?


富国沪深
浏览 898回答 3
3回答

HUWWW

如果您使用的是Linux,则标准C库包括一个名为的函数backtrace,该函数用帧的返回地址填充一个数组,以及另一个名为的函数backtrace_symbols,该函数将从中获取地址backtrace并查找相应的函数名。这些记录在GNU C库手册中。这些不会显示参数值,源代码行等,它们仅适用于调用线程。但是,它们应该比以这种方式运行GDB快得多(也许不那么松懈),因此它们有自己的位置。
打开App,查看更多内容
随时随地看视频慕课网APP