相关疑难解决方法(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万
查看次数

带有-static和-rdynamic的backtrace_symbols()

看看这个问题这个问题,我可以看到,为了backtrace_symbols()工作,必须用-rdynamic旗子编译.

我试过它变成一个测试程序和它的作品,但我正在写也与编译的程序-static这个页面说,backtrace_symbols()当不工作-static被传递到编译器/连接.

有没有快速的解决方法,或者我的静态链接程序中永远不会有人类可读的回溯功能?

c c++ symbols backtrace static-linking

10
推荐指数
1
解决办法
4792
查看次数

对当前堆栈进行校验和

我想在main中对当前堆栈进行校验和,以检查它是否在两点之间被改变.

例如:

int main(void) {
    ...
    stack_checksum();

    ... process ...

    if(stack_checksum() != ...)
        altered.
}
Run Code Online (Sandbox Code Playgroud)

如何获取基本堆栈地址和堆栈顶部的当前地址?

编辑: 随着@MiroslavBajtoš帮助,步骤方法:

  • 将局部变量放在结构中
  • 检查回溯返回数组

c stack checksum

7
推荐指数
1
解决办法
246
查看次数

标签 统计

c ×3

backtrace ×2

c++ ×1

checksum ×1

debugging ×1

linux ×1

stack ×1

static-linking ×1

symbols ×1