如何将分段错误地址映射到相应的C代码?

如何将分段错误地址映射到相应的C代码?,c,linux,C,Linux,我在157e8250 ip 157e8250 sp bfa3fdfb上看到这样的分段故障segfault如何将此地址映射到发生故障的相应代码?假设您有可以编译的源代码。如果您使用调试符号编译它,并在gdb中运行它,它将用行号和其他好东西打印堆栈跟踪。我建议使用Valgrind。用法是: valgrind。如果编译时启用调试符号(使用gcc中的-g选项),您将获得发生SEGFULT的堆栈中每个级别的确切行号。使用套件中的addr2line实用程序。例如,它打印出文件名、行号和函数名(如果是C++函

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

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

我建议使用Valgrind。用法是:
valgrind
。如果编译时启用调试符号(使用gcc中的
-g
选项),您将获得发生SEGFULT的堆栈中每个级别的确切行号。

使用套件中的addr2line实用程序。例如,它打印出文件名、行号和函数名(如果是C++函数,则对其进行解扩),以显示错误地址0x157e825:

addr2line -e my_executable_file -C -f 0x157e8250
您还可以在命令行中传递任意数量的地址,例如,如果只有指令地址的堆栈跟踪

确保使用
-g
编译器选项编译程序以生成调试符号,否则
addr2line
将无法为您符号化任何内容

  • 您应该添加gcc的“-g”选项

  • 使用gnu工具“addr2line”,例如

    # addr2line -e a.out 0x80484c8 -f
    
    -e: executable file name
    -f: generate function name