是否可以将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
对于CCD_ 2中的所有地址。我知道从Service::Controller::frame
到Manager::run
(甚至可能是lambda/opt/s3ds/App() [0x62bfea]
)的跟踪中的函数应该在我的应用程序代码中(而不是在某个库中)。
那么,有可能获得生产优化代码的行号吗?是否需要额外的编译器权限才能获得它们?
这可能是可能的,但可能意义不大。
您必须明白,优化的目标是更改代码以使其更好(通过某种度量);而改变意味着所得到的代码可能在之后没有被有意义地映射到源代码。
一些例子:
- Dead Code Elimination等将删除现有代码,这主要影响在给定源行放置断点的尝试,因为该行可能没有代码
- Common Sub Expression Elimination将突然创建新的临时变量,以便只计算一次子表达式;这些子表达式最初可能出现在源代码中的多个表达式中,因此新指令属于多行。。。或者根本没有
- 与原始源代码相比,不变提升或循环旋转将改变表达式的计算顺序,因此您可能会看到在第3行执行的代码,然后是第6行,然后是4、5、7
- 循环展开将多次复制/粘贴循环的正文
当然,这些都是函数的本地,你还必须考虑
- 函数内联将在调用站点复制粘贴函数的正文
- 函数合并将采用两个不同的函数并删除其中一个,将其调用转发给另一个(当然,因为它们具有相同的行为)
毕竟,从源代码的角度来尝试和推理有意义吗?不,不是真的。当然,我甚至没有考虑到这样一个事实,即所有这些转换都发生在中间表示上,并且汇编代码的最终发布将进一步扰乱事物(是的,强度降低!)。
老实说,即使addr2line
给你一些线索,我也会怀疑它的结果。。。那么问这个问题有什么意义呢?
我不确定。通常,当函数是您自己代码的一部分时(在您的示例中,情况似乎就是这样),rdynamic
开关应该足够了
你试过用-fno-inline-functions -fno-inline-functions-called-once -fno-optimize-sibling-calls
编译吗?它在分析优化程序时非常有用。也许它也可以帮助解决你的问题。
(旁注:使用-C
开关调用addr2line
会激活去映射,建议您使用C++。)
- const-ref传递的模板化参数是否经过优化,以便在足够小时按值传递
- 解析参数后内联以优化算法速度
- 未优化的 constexpr 的未定义引用用作默认参数
- 传递成员作为参数函数到优化器(将成员函数传递给函数)
- 优化了标签(空结构)函数参数的处理
- 多个函数需要相同的参数(如何优化)
- 使用通过引用(通过指针)传递的参数优化 OpenCL 函数中的指针访问
- 为什么传递值参数经常使编译器更容易进行代码优化
- c++ 编译器优化是否可以针对布尔参数生成两个版本的函数
- 优化开关(x),x是作为参数传递的常量数
- Opencv 中的 SVM 参数优化
- 是否可以将addr2line与使用发布优化参数编译的应用程序一起使用
- 如何不指定函数参数的精确求值顺序有助于C&C++编译器生成优化的代码?
- 将整数零模板参数优化出来
- 当函数参数是常量引用临时或按值复制的临时时,为什么 MSVC 优化会破坏 SSE 代码
- 如何优化代码中的参数
- 使用非类型模板参数C++优化
- C++ 对返回其参数的函数模板进行编译器优化
- C++编译器是否根据模板参数优化模板方法
- C++:未使用参数优化的力度