我在 Linux 上使用 ADDR2LINE 并且有以下代码专门生成段错误以进行测试

79 free(var1);
80
81 printf("Thread end...\n");
82 free(var1);
83 }

上面的第 82 行是执行“双重释放”和导致转储的那个……但是,当我在命令行上使用 ADDR2LINE 时,它将导致错误的行号报告为 83 而不是 82?

我在这里错过了什么吗? ADDR2Line 是否提到 NEXT 行?

感谢您的帮助

林顿

最佳答案

ADDR2LINE 确实给出了崩溃的行号,而不是下一个。
尝试在 main() 附近添加此代码以获取最后一个地址的回溯并将它们传递给 addr2line.. 看看你得到了什么。

void sig_segv(int signo)
{
// Generate backtrace
void *addresses[40];
char **strings;
int c = backtrace(addresses, 40);
strings = backtrace_symbols(addresses,c);
printf("backtrace returned: %d\n", c);
for (int i = 0; i < c; i++) {
    std::cout << strings[i] << std::endl;
}
exit(1);
}

在 main() 里面
signal(SIGSEGV, sig_segv);

唯一正确的原因/解释是它确实在免费功能崩溃。但是在返回值处,因此这意味着第 82 行的结束和第 83 行的开始。

10-08 20:02