c - ADDR2LINE 报告的行号是 1 号吗?

标签 c

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

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

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

我是不是漏掉了什么? ADDR2Line 是否提到了下一行?

谢谢你的帮助

林顿

最佳答案

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);

唯一正确的原因/解释是它确实在 free 函数处崩溃了。但是在返回值处,因此这意味着第 82 行的结尾和第 83 行的开头。

关于c - ADDR2LINE 报告的行号是 1 号吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6394855/

相关文章:

C 使用信号停止子进程

c++ - 如何检测 Linux/MacOs 平台中的内存泄漏?

c - 使用 sleep 函数时如何增加计数?

使用 O_DIRECT 一致写入许多 block

c - 使用 ptrace 从结构中检索信息

c - 如何为每个元音创建一个流程?

c - 使用 C 中的计数出现次数进行 Turbo Sort 排序最多 10^6

c - 如何将具有多个源子目录的 Make 和 Autotools 项目迁移到 CMake?

c - ARM 处理器的链表问题

c - 如何提取除前两个字符以外的所有子字符串?