我正在尝试自动执行一些调试任务。在某些情况下,我将$ra[这是mips机器]的值和堆栈的一部分打印为十六进制地址。在调试期间,我使用addr2line将它们转换为file:line对。
我想把这个过程自动化。
问题是addr2line返回的文件名在编译时等于__FILE__的值,即传递给编译器的文件名。这通常是foo.c,有时是src/foo.c。由于我的项目总共有几百个目录,这可能不足以唯一标识文件(可能有1/foo.c2/foo.c,等等)。即使它是确定性的,在我的屏幕上为每个参数运行find似乎效率很低[我想我可以构建一个散列表并保存它们,但我想将其作为一个简单的bash脚本来保存]
gdb似乎得到了正确的文件。如果我查看带有调试符号的实际源文件,我还可以看到文件名后面似乎有指向__FILE__的完整路径,即,如果__FILE__src/foo.c,并且它确实在/home/me/projects/something/comp1/src/foo.c中,我将在文件中看到/home/me/projects/something/comp1。我怎样才能从程序上得到这个?
谢谢。

最佳答案

这是非常令人惊讶的行为。我无法复制:
带有gcc 4.1.2和addr2line 2.17.50.0.6的Linux
Cygwin与GCC 4.3.4和GCC 3.4.4以及ADDR2第2.20.51.20100410行
addr2line应该依赖于存储在可执行文件中的调试信息。并且调试信息应该包含绝对路径(不管给编译器提供了什么源路径),以避免在使用调试器时出现任何歧义。无论我在哪里尝试,addr2line总是显示一个绝对路径。
假设您正在为构建系统使用make,一个选项(尽管可能是一个痛苦的选项)是将makefile更改为使用非递归策略(无论如何,您确实应该这样做)。在这样的系统中,只有一个make实例在运行,它来自一个工作目录(通常是源树的顶层)。因此,编译器的所有调用都指定源文件的完整路径(相对于源树的根)。如果addr2line总是按照指定给编译器的文件名来显示文件名,这将解决您的问题。不是最好的解决方案,但可以奏效。作为一个附带的好处,您将获得非递归make的所有优点。

关于linux - 从addr2line获取完整路径,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3370067/

10-11 19:22