use*_*588 9 debugging gcc gdb clang
我对开箱即用的答案,方法和想法很感兴趣.在较高的层次上,主页面非常稀疏,它们主要列出-g一个级别,表明这-O0也是非常有用或必不可少的.
但我想知道可以给出哪些其他铿锵标志来进行最大程度的调试.是否有一个等效的gcc -ggdb3,其中包含一些直接在对象输出中的源或注释?或者可以吗?重新编译操作系统及其原始库以进行调试是否可行且有用(如果是的话,如果我使用的是Debian,我是否可以将调试写入主.deb包而不是单独调试.deb包哪个存储调试数据/usr/lib/debug?)?静态构建二进制文件是否会影响查看良好堆栈跟踪的能力?有什么需要做的,以确保addr2line运作良好?是否需要使用clang编译所有库(甚至glibc)以获得最大的调试优势?我注意到有一个项目要用clang重新编译Debian,否则我会对这样做或者强调调试的发行版开放.
在Linux上,还有一些选项,如LD_PRELOADset to /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(如上所述),和LD_BIND_NOW=yes.另外我相信我更喜欢gcc在/ usr/lib/debug中搜索库 - 使用strategy -Bs 在标准搜索路径之上.此外,--whole-archive用于静态构建可能会确保链接输出中包含更多对象.还有ulimit -c unlimited,在Linux上一个区分核心文件的好方法,如:
sysctl -w kernel.core_pattern="core.%t.SIG-%s.PID-%p.ID-%g-%u.%h.%E"
Run Code Online (Sandbox Code Playgroud)
对于gcc,我已经使用过并看过如下标志:( -O0 -fno-omit-frame-pointer -fverbose-asm -ggdb3 -mno-omit-leaf-frame-pointer -mtune=generic -fvar-tracking -D_GLIBCXX_DEBUG=1 -frecord-gcc-switches -femit-class-debug-always -fmath-errno -fno-eliminate-unused-debug-symbols -fno-eliminate-unused-debug-types -fno-merge-debug-strings -mieee-fp -mtune=generic -static-libgcc -fexceptions -fvar-tracking -fbounds-check -rdynamic -UNDEBUG -DDEBUG=1 (-ffreestanding -static-libgcc -pass-exit-codes) -fno-stack-check因为我相信我已经读到后者会干扰调试)
其他标志是出于其他原因,但重点是最大化调试.对于上述全部或大部分内容,尚不清楚clang在何种程度上支持或使用,或者是否有其他选择.
正如您所注意到的,Clang 不支持该-ggdb3标志,仅支持-g。如果您尝试使用它,您将收到以下消息:
clang: warning: argument unused during compilation: '-ggdb3'
Run Code Online (Sandbox Code Playgroud)
所以你可以通过 Clang 运行整个命令行,它会告诉你它支持哪些 GCC 标志,不支持哪些,有些会打印警告,有些可能会出错,但 Clang 不会默默地忽略它们。以下是当我尝试你的长命令时 Clang 拒绝的命令:-static-libgcc和-pass-exit-codes。
正如另一个 SO 答案中指出的,clang -cc1 --help可用于列出支持的编译标志,其中我们看到您可能感兴趣的以下内容:
-disable-llvm-optzns: 不要运行 LLVM 优化过程-fno-elide-constructors:禁用 C++ 复制构造函数省略-mdisable-fp-elim:禁用帧指针消除优化