相关疑难解决方法(0)

如何使backtrace()/ backtrace_symbols()打印函数名称?

特定于Linux backtrace()backtrace_symbols()允许您生成程序的调用跟踪.但是,它只打印功能地址,而不是我的程序的名称.如何让它们也打印出函数名?我试着编译程序-g以及-ggdb.下面的测试用例打印出来:


    BACKTRACE ------------
    ./a.out() [0x8048616]
    ./a.out() [0x8048623]
    /lib/libc.so.6(__libc_start_main+0xf3) [0x4a937413]
    ./a.out() [0x8048421]
    ----------------------
    

我希望前两个项目也显示函数名称,foomain

码:

#include <execinfo.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>

static void full_write(int fd, const char *buf, size_t len)
{
        while (len > 0) {
                ssize_t ret = write(fd, buf, len);

                if ((ret == -1) && (errno != EINTR))
                        break;

                buf += (size_t) ret;
                len -= (size_t) ret;
        }
}

void print_backtrace(void)
{
        static const …
Run Code Online (Sandbox Code Playgroud)

c linux debugging backtrace

85
推荐指数
3
解决办法
5万
查看次数

如何获得更详细的回溯

当我的C++程序终止时,我正在尝试打印回溯.功能打印回溯如下所示;

   void print_backtrace(void){

       void *tracePtrs[10];
       size_t count;

       count = backtrace(tracePtrs, 10);

       char** funcNames = backtrace_symbols(tracePtrs, count);

       for (int i = 0; i < count; i++)
           syslog(LOG_INFO,"%s\n", funcNames[i]);

       free(funcNames);

}
Run Code Online (Sandbox Code Playgroud)

它给出了类似的输出;

   desktop program: Received SIGSEGV signal, last error is : Success
   desktop program: ./program() [0x422225]
   desktop program: ./program() [0x422371]
   desktop program: /lib/libc.so.6(+0x33af0) [0x7f0710f75af0]
   desktop program: /lib/libc.so.6(+0x12a08e) [0x7f071106c08e]
   desktop program: ./program() [0x428895]
   desktop program: /lib/libc.so.6(__libc_start_main+0xfd) [0x7f0710f60c4d]
   desktop program: ./program() [0x4082c9]
Run Code Online (Sandbox Code Playgroud)

有没有办法获得更详细的函数名称和行回溯,如gdb输出?

c linux

19
推荐指数
2
解决办法
1万
查看次数

标签 统计

c ×2

linux ×2

backtrace ×1

debugging ×1