我可以将哪些标志或环境变量传递给Clang以在BSD和Linux上进行最大程度的调试?

前端之家收集整理的这篇文章主要介绍了我可以将哪些标志或环境变量传递给Clang以在BSD和Linux上进行最大程度的调试?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我对开箱即用的答案,方法和想法很感兴趣.在较高的层次上,主页面非常稀疏,它们主要列出-g,有一个级别,这表明-O0也非常有用或必不可少.

但是我想知道可以给出哪些其他的clang标志来进行最大程度的调试.有没有相当于gcc的-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重定向为总是成功的no-op命令,但是建议其他关于确保合规性的想法(我相信pkgsrc)在shell脚本中包装gcc和链接器做得很好 – 对插入强制标志很有用.还可以存在各种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中搜索库 – 使用策略-Bs在标准搜索路径之上.此外,对静态构建使用–whole-archive可能会确保链接输出中包含更多对象.还有ulimit -c无限制,在Linux上一个区分核心文件的好方法,如:

sysctl -w kernel.core_pattern="core.%t.SIG-%s.PID-%p.ID-%g-%u.%h.%E"

对于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-elimination-unused-debug-symbols -fno-elimination-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'

所以你可以通过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:禁用帧指针消除优化

猜你在找的Linux相关文章