gpt4 book ai didi

c++ - 从信号处理程序打印堆栈跟踪

转载 作者:IT王子 更新时间:2023-10-29 00:53:52 26 4
gpt4 key购买 nike

我需要从在 Linux 上运行的 64 位多线程 C++ 应用程序的信号处理程序打印堆栈跟踪。虽然我找到了几个代码示例,但没有一个可以编译。我的阻塞点是从 ucontext_t 结构中获取调用者的(信号生成点)地址。我能找到的所有信息都将 EIP 寄存器指向 ucontext.gregs[REG_EIP] 或 ucontext.eip。看起来它们都是 x86 特定的。我需要适用于 Intel 和 AMD CPU 的 64 位兼容代码。有人可以帮忙吗?

最佳答案

有一个 glibc 函数backtrace。手册页列出了调用示例:

#define SIZE 100
void myfunc3(void) {
int j, nptrs;

void *buffer[100];
char **strings;

nptrs = backtrace(buffer, SIZE);
printf("backtrace() returned %d addresses\n", nptrs);

/* The call backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO)
would produce similar output to the following: */

strings = backtrace_symbols(buffer, nptrs);
if (strings == NULL) {
perror("backtrace_symbols");
exit(EXIT_FAILURE);
}

for (j = 0; j < nptrs; j++)
printf("%s\n", strings[j]);

free(strings);
}

有关更多上下文,请参阅手册页。

很难判断这是否真的能保证在信号处理程序中工作,因为 posix 只列出了几个保证工作的可重入函数。请记住:当您的进程的其余部分正处于 malloc 调用的中间时,可能会调用信号处理程序。

我的猜测是,这通常有效,但有时可能会失败。对于调试,这可能就足够了。

关于c++ - 从信号处理程序打印堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9207599/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com