即使用-g3编译,addr2line也会返回??:0,gdb回溯工作正常。
这个问题涉及到编译器选项、调试工具和符号表等概念。
首先,编译器选项中的-g3表示生成包含完整调试信息的可执行文件。这些调试信息包括源代码行号、变量名等,可以在调试过程中帮助开发人员定位问题。
addr2line是一个工具,可以将地址转换为源代码的行号。通常情况下,当使用-g选项编译时,addr2line可以准确地将地址转换为源代码行号。然而,在某些情况下,即使使用-g3编译,addr2line也可能返回??:0,表示无法将地址转换为源代码行号。
这种情况下,可以考虑以下几个可能的原因:
至于gdb回溯工作正常的原因,可能是因为gdb使用了其他调试信息,如DWARF调试信息,来进行回溯。与addr2line不同,gdb可以使用多种调试信息源来获取源代码行号等信息,因此即使addr2line无法正常工作,gdb仍然可以进行回溯。
总结起来,即使使用-g3编译,addr2line返回??:0可能是编译器、编译器选项或符号表的问题。而gdb回溯工作正常可能是因为它使用了其他调试信息源。在遇到这种情况时,可以尝试调整编译器选项、更新编译器版本、重新生成符号表等方法来解决问题。
领取专属 10元无门槛券
手把手带您无忧上云