如何给以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")
posted @   zwlwf  阅读(683)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示