加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

我可以将哪些标志或环境变量传递给Clang以在BSD和Linux上进行最

发布时间:2020-12-13 16:58:58 所属栏目:Linux 来源:网络整理
导读:我对开箱即用的答案,方法和想法很感兴趣.在较高的层次上,主页面非常稀疏,它们主要列出-g,有一个级别,这表明-O0也非常有用或必不可少. 但是我想知道可以给出哪些其他的clang标志来进行最大程度的调试.有没有相当于gcc的-ggdb3,其中包含一些直接在对象输出中的
我对开箱即用的答案,方法和想法很感兴趣.在较高的层次上,主页面非常稀疏,它们主要列出-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:禁用帧指针消除优化

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读