我对开箱即用的答案,方法和想法感兴趣。在较高的层次上,主页面非常稀疏,它们主要列出-g
,只有一个级别,表明-O0
也非常有用或必不可少。
但是我想知道可以给出哪些其他铿锵标志来进行最大程度的调试。是否有等同于gcc' s -ggdb3
,其中包含一些直接在对象输出中的源或注释?或者可以吗?是否有可能并且有助于重新编译操作系统及其原始库以进行调试(如果是这样,如果我使用Debian,我是否可以将调试编写到主.deb包而不是单独调试。 deb包,它将调试数据存储在/usr/lib/debug
?)?静态构建二进制文件是否会影响查看良好堆栈跟踪的能力?有什么需要做的,以确保addr2line运作良好?是否需要使用clang编译所有库(甚至glibc)以获得最大的调试优势?我注意到有一个项目要用clang重新编译Debian,否则我会对这样做的分发开放,或者强调调试。
在Linux上,还有一些选项,例如LD_PRELOAD
设置为/lib/libSegFault.so
,或者LD_LIBRARY_PATH
重新分配给/usr/lib/debug
而不是通常的/ usr / lib位置(包括将libc本身重定向到调试版本)。对于如何增强二进制文件的可调试性这个问题的答案,是否存在中心位置或外部源?更大的谜团是clang,因为我在漫长的gcc手册页中看到有各种选项可以增加调试(或减少优化),但另一方面,clang的文档只显示较小的一组。 clang可能会接受比给定更多的选项,包括gcc标志(可能转换为无操作或更多调试 - 没有规范的信息来源很难说出来。)
同样从包构建的角度来看,由于外部包可能不尊重CFLAGS
,因此我将/usr/bin/strip
重定向为始终成功的无操作命令,但其他有关确保的想法建议遵从性(我相信pkgsrc在包装gcc和shell脚本中的链接器方面做得很好 - 对插入强制标志很有用)。还可以存在各种ld选项以增加输出目标的调试。此外,BSD(包括基于clang的FreeBSD 10)可能具有不同的链接体系结构,这使得在生成的库和可执行文件中更容易请求和查找调试符号。
为了更广泛地定义调试,我设置了LD_WARN=yes
,LD_DEBUG=unused
,SEGFAULT_SIGNALS="all"
,LD_PRELOAD=.../libSegFault.so
(如上所述)和{{1} }。另外我相信我更喜欢gcc在/ usr / lib / debug中搜索库 - 使用策略LD_BIND_NOW=yes
s在标准搜索路径之上。此外,使用-B
进行静态构建可能会确保链接输出中包含更多对象。还有--whole-archive
,在Linux上可以很好地区分核心文件,如:
ulimit -c unlimited
对于gcc,我曾经使用和看过像sysctl -w kernel.core_pattern="core.%t.SIG-%s.PID-%p.ID-%g-%u.%h.%E"
这样的标志(因为我相信我已经读过,后者会干扰调试)
其他标志是出于其他原因,但重点是最大化调试。对于上述全部或大部分内容,尚不清楚clang在何种程度上支持或使用,或者是否有其他选择。
答案 0 :(得分:2)
Clang不支持-ggdb3
标志,只支持-g
,正如您所注意到的那样。如果您尝试使用它,您将收到消息:
clang: warning: argument unused during compilation: '-ggdb3'
所以你可以通过Clang运行你的整个命令行,它会告诉你它支持哪些GCC标志,哪些没有,有些会打印警告,有些可能会出错,但是Clang不会默默地忽略它们。以下是我尝试你的长命令时Clang拒绝的那些:-static-libgcc
和-pass-exit-codes
。
正如another SO answer中所指出的,clang -cc1 --help
可用于列出支持的编译标记,我们会在其中看到您可能感兴趣的以下内容:
-disable-llvm-optzns
:不要运行LLVM优化传递-fno-elide-constructors
:禁用C ++拷贝构造函数elision -mdisable-fp-elim
:禁用帧指针消除优化