我看到像segfault at 157e8250 ip 157e8250 sp bfa3fdfb
这样的分段错误如何将此地址映射到发生故障的相应代码?
答案 0 :(得分:5)
使用GNU binutils套件中的addr2line实用程序。例如,这会打印出错误地址0x157e8250的文件名,行号和函数名(如果它是C ++函数,则将其解析):
addr2line -e my_executable_file -C -f 0x157e8250
您还可以在命令行中传递任意数量的地址,例如如果你有一个只有指令地址的堆栈跟踪。
确保使用-g
编译器选项编译程序以生成调试符号,否则addr2line
将无法为您设置任何符号。
答案 1 :(得分:5)
您应该添加gcc
使用gnu工具“addr2line”,比如,
# addr2line -e a.out 0x80484c8 -f
-e: executable file name
-f: generate function name
答案 2 :(得分:2)
假设您有可以编译的源代码。如果使用调试符号编译它并在gdb中运行它,它将打印带有行号和其他好东西的堆栈跟踪。
答案 3 :(得分:2)
我建议使用Valgrind。用法是:
valgrind <your program name> <command-line arguments to your program>
。如果使用调试符号进行编译(使用gcc中的-g
选项),您将获得发生段错误的堆栈中每个级别的确切行号。