如何给以make工具构建的工程中加debug编译选项
问题描述
make可以像bash一样调用很多命令,debug选项属于编译器(以gcc为例),所以这个问题更准确的描述应该是:如何给make工程中gcc传递-g
参数。
之所以还用上面的名字,是因为最初的诉求冲到脑子的就是上面的样子。
一个偷梁换柱的思路
首先我们给gcc弄个wrapper程序gcc_wrapper
,在这个wrapper的gcc中调用真实的gcc,并加一些构建参数。简单得可以弄成如下的bash脚本
#!/usr/bin/bash
#gcc_wrapper
gcc -g $@
现在梁准备好了,接下来是怎么去换的问题。
一般Makefile工程中的编译器compiler都是可配置的,要么configure的时候读取CC系统变量,要么在Makefile开头指定CC变量,这两种情况我们通过配置这两变量来修改编译器为我们的gcc_wrapper
。
也有可能有极端情况,作者将gcc写死到了make中编译命令(个人测试程序经常会这么写)。这种情况,可以首先将ln -s gcc_wrapper gcc
,建一个软链接,且gcc_wrapper
中的gcc用真实gcc的绝对路径。然后通过配置bash中PATH
变量,将gcc_wrapper
所在路径放在PATH前面,如此make的时候就会用到我们的gcc_wrapper
.
最后有一点需要注意:chmod a+x gcc_wrapper
.
update 2023-05-28
构建编译选项的bin时,我们不希望系统加-O3 -O2
等优化选项,所以上述gcc_wrapper
可以进一步优化为
#!/usr/bin/bash
gcc -g ${@/-0[1-3]/-O0}
update 2023-06-10
在不动项目的前提下,我们可以通过bash的PATH
变量上做手脚。
新建一个gcc_wrapper
目录,在目录下提供两个文件gcc、g++(可执行的bash脚本)文件,两个文件的内容分别如下
#!/usr/bin/bash
/usr/bin/gcc -g ${@/-0[1-3]/-O0}
#!/usr/bin/bash
/usr/bin/g++ -g ${@/-0[1-3]/-O0}
然后export PATH=/path/to/gcc_wrapper:$PATH
,即可完成对项目的debug模式编译。
研究问题过程中下的蛋
这个页面https://9to5answer.com/how-do-i-set-a-conditional-breakpoint-in-gdb-when-char-x-points-to-a-string-whose-value-equals-quot-hello-quot告诉了如何在gdb中使用字符串相等的条件设置断点。Solution 2 实测可用。
b remake.c:180 if $_streq(file->name, "all")
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通