我正在尝试自动化一些调试任务。在某些情况下,我输出$ra的值这是一台MIPS机器和堆栈的一部分作为十六进制地址。在调试期间,我使用addr2line将它们转换为file:line对。
我想让这个过程自动化。
问题是addr2line返回的文件名与编译时__FILE__的值相同;即传递给编译器的文件名。这通常是foo.c,有时是src/foo.c。因为我的项目总共有几百个目录,这可能不足以唯一地标识文件(可能有1/foo.c、2/foo.c等)。即使它是确定性的,在我的屏幕中为每个参数运行find似乎效率也很低我想我可以构建一个哈希表并保存它们,但我希望将其作为一个简单的bash脚本
GDB似乎得到了正确的文件。如果我查看带有调试符号的实际源文件,我还可以看到紧跟在文件名之后的是__FILE__的完整路径[也就是说,如果__FILE__是src/foo.c,并且它实际上在/home/me/projects/something/comp1/src/foo.c中,我将在文件中看到/home/me/projects/something/comp1。我怎样才能以程序的方式获得它呢?
谢谢。
发布于 2010-07-30 22:28:50
这是非常令人惊讶的行为。我无法在以下位置重现它:
带有gcc 4.1.2的
addr2line应该依赖于存储在可执行文件中的调试信息。并且调试信息应该包含绝对路径(不管提供给编译器的源路径是什么),以避免在使用调试器时出现任何歧义。无论我在哪里尝试它,addr2line总是显示一条绝对路径。
假设您在构建系统中使用make,一种选择是将makefile更改为使用非递归策略(这是您无论如何都应该做的事情)。在这样的系统中,只有一个make实例从单个工作目录(通常是源代码树的顶层)运行。因此,编译器的所有调用都指定了源文件的完整路径(相对于源树的根)。实际上,如果addr2line总是按照编译器指定的方式显示文件名,那么这就解决了您的问题。这不是最好的解决方案,但也是可行的。作为一个附带的好处,您将获得非递归make的所有优点。
https://stackoverflow.com/questions/3370067
复制相似问题