繁体   English   中英

是否可以将addr2line与使用版本优化参数编译的应用程序一起使用?

[英]Is it possible to use addr2line with application compiled with release optimization arguments?

所以我有回溯

Exit with signal 11 at 2013-12-28_14:28:58.000000
/opt/s3ds/App(_Z7handlers+0x52) [0x5de322]
/lib/libc.so.6(+0x32230) [0x7f6ab9b3a230]
/opt/s3ds/App(_ZN17Service17Controller5frameERKf+0x505) [0x5a6b85]
/opt/s3ds/App(_ZN17Service15Cloud10updateEf+0x1de) [0x58642e]
/opt/s3ds/App(_ZN17Manager6updateEf+0x21b) [0x59194b]
/opt/s3ds/App(_ZN7Manager3runEv+0xd2) [0x604fa2]
/opt/s3ds/App() [0x62bfea]
/lib/libpthread.so.0(+0x68ca) [0x7f6abb0048ca]
/lib/libc.so.6(clone+0x6d) [0x7f6ab9bd7b6d]

我用以下参数编译了应用程序:

            -std=c++11 -fpermissive -m64 -g -rdynamic -mtune=native -flto -O3

因此,这是一个发布版本,其中包含一些最少的调试信息。

我想知道是否可以使用addr2line从这种优化的构建中获取任何行号?

我尝试了此处显示的示例,但得到了??:0

$ addr2line -e ./App 0x62bfea
??:0

用于[]所有地址。 我知道从Service::Controller::frameManager::run跟踪中的功能(甚至可能是lambda /opt/s3ds/App() [0x62bfea] )应在我的应用程序代码中(不在某些库中) )。

那么是否有可能获得生产优化代码的行号? 要获取它们,还需要其他编译器指令吗?

我不确定。 通常,当函数是您自己的代码的一部分时, rdynamic开关应该就足够了(在您的示例中似乎是这种情况)

您是否尝试过使用-fno-inline-functions -fno-inline-functions-called-once -fno-optimize-sibling-calls进行编译? 在分析优化程序时,此功能很有用。 也许它也可以帮助您解决问题。

(旁注:使用-C开关调用addr2line激活拆线,建议您使用此方式,因为使用的是C ++。)

可能是可能的,但可能并不足够。

您必须了解, 优化的真正目的是更改代码以使其更好(按某种度量标准)。 变更意味着最终的代码可能不会在之后有意义地映射到源代码。

一些例子:

  • 消除死代码之类的方法将删除现有代码,这主要影响在给定源代码行上放置断点的尝试,因为该行可能没有代码
  • 通用子表达式消除将突然创建新的临时变量以仅计算一次子表达式; 这些子表达式最初可能出现在遍及源代码的多个表达式中,因此新指令属于多行...或根本没有。
  • 与原始源代码相比,不变的提升或循环循环将更改表达式的计算顺序,以便您可能会看到在第3行,第6行,然后是4、5、7等执行的代码。
  • 循环展开将多次复制/粘贴循环主体

当然,这些是功能的局部功能,您还必须考虑到

  • Function Inlining将在调用站点复制粘贴函数的主体
  • 函数合并将采用两个不同的功能,并删除其中一个,将其调用转发给另一个(当然,因为它们具有相同的行为)

毕竟,尝试并根据源代码进行推理甚至有意义吗? 不,不是。 当然,我什至没有考虑所有这些转换都发生在中间表示上的事实,并且最终的汇编代码发布将使事情更加混乱(强度降低,是的!)。

老实说,即使addr2line给了你几行,我也会怀疑它的结果...然后首先问点什么呢?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM