4

我看到这样的分段错误segfault at 157e8250 ip 157e8250 sp bfa3fdfb如何将此地址映射到发生故障的相应代码?

4

4 回答 4

5

使用GNU binutils套件中的 addr2line 实用程序。例如,这会打印出错误地址 0x157e8250 的文件名、行号和函数名(如果它是 C++ 函数,则将其解构):

addr2line -e my_executable_file -C -f 0x157e8250

您还可以在命令行中传递任意数量的地址,例如,如果您只有指令地址的堆栈跟踪。

确保使用-g编译器选项编译程序以生成调试符号,否则addr2line将无法为您表示任何东西。

于 2012-10-12T04:39:41.897 回答
5
  1. 您应该添加 gcc 的“-g”选项

  2. 使用 gnu 工具“addr2line”,例如,

    # addr2line -e a.out 0x80484c8 -f
    
    -e: executable file name
    -f: generate function name 
    
于 2012-10-12T04:41:50.557 回答
2

假设您有可以编译的源代码。如果你用调试符号编译它并在 gdb 中运行它,它会打印带有行号和其他好东西的堆栈跟踪。

于 2012-10-12T04:30:58.043 回答
2

我建议使用 Valgrind。用法是: valgrind <your program name> <command-line arguments to your program>。如果您使用调试符号进行编译(使用-ggcc 中的选项),您将获得堆栈中发生段错误的每个级别的确切行号。

于 2012-10-12T04:33:55.440 回答