[英]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::frame
到Manager::run
跟踪中的功能(甚至可能是lambda /opt/s3ds/App() [0x62bfea]
)应在我的应用程序代码中(不在某些库中) )。
那么是否有可能获得生产优化代码的行号? 要获取它们,还需要其他编译器指令吗?
我不确定。 通常,当函数是您自己的代码的一部分时, rdynamic
开关应该就足够了(在您的示例中似乎是这种情况)
您是否尝试过使用-fno-inline-functions -fno-inline-functions-called-once -fno-optimize-sibling-calls
进行编译? 在分析优化程序时,此功能很有用。 也许它也可以帮助您解决问题。
(旁注:使用-C
开关调用addr2line
激活拆线,建议您使用此方式,因为使用的是C ++。)
可能是可能的,但可能并不足够。
您必须了解, 优化的真正目的是更改代码以使其更好(按某种度量标准)。 变更意味着最终的代码可能不会在之后有意义地映射到源代码。
一些例子:
当然,这些是功能的局部功能,您还必须考虑到
毕竟,尝试并根据源代码进行推理甚至有意义吗? 不,不是。 当然,我什至没有考虑所有这些转换都发生在中间表示上的事实,并且最终的汇编代码发布将使事情更加混乱(强度降低,是的!)。
老实说,即使addr2line
给了你几行,我也会怀疑它的结果...然后首先问点什么呢?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.