首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从addr2line获取完整路径

从addr2line获取完整路径
EN

Stack Overflow用户
提问于 2010-07-30 17:06:04
回答 1查看 1.4K关注 0票数 2

我正在尝试自动化一些调试任务。在某些情况下,我输出$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。我怎样才能以程序的方式获得它呢?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-30 22:28:50

这是非常令人惊讶的行为。我无法在以下位置重现它:

带有gcc 4.1.2的

  • Linux和带有gcc 4.3.4和gcc 3.4.4的addr2line 2.17.50.0.6
  • Cygwin以及addr2line Linux

addr2line应该依赖于存储在可执行文件中的调试信息。并且调试信息应该包含绝对路径(不管提供给编译器的源路径是什么),以避免在使用调试器时出现任何歧义。无论我在哪里尝试它,addr2line总是显示一条绝对路径。

假设您在构建系统中使用make,一种选择是将makefile更改为使用非递归策略(这是您无论如何都应该做的事情)。在这样的系统中,只有一个make实例从单个工作目录(通常是源代码树的顶层)运行。因此,编译器的所有调用都指定了源文件的完整路径(相对于源树的根)。实际上,如果addr2line总是按照编译器指定的方式显示文件名,那么这就解决了您的问题。这不是最好的解决方案,但也是可行的。作为一个附带的好处,您将获得非递归make的所有优点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3370067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档