如何在整个项目(由其他人创建)中添加标志(例如-g)?

Posted

技术标签:

【中文标题】如何在整个项目(由其他人创建)中添加标志(例如-g)?【英文标题】:How to add a flag (such as -g) to the whole project (created by someone else)? 【发布时间】:2012-04-17 14:16:31 【问题描述】:

我正在使用一个库(这对我的工作至关重要),我怀疑它可能存在错误。不幸的是,图书馆的所有者对尝试我的示例代码反应迟钝。我将尝试自己调试它。

老实说,它不仅仅是一个库,它是一个库加上一组内核模块,并且崩溃发生在内核级别(非常讨厌),而且对于代码的所有者来说确实也很难发现。

有时我很幸运,我得到一个内核 oops,如果我可以使用 -g 选项构建他的代码,我可以找到错误发生在哪一行(这很有帮助,因为我刚刚开始面对他的大量几乎没有线索的代码)。

现在项目的 GNUmakefiles 是用 automake 构建的(我相信)。我的问题是如何告诉make 在整个构建过程中将-g 添加到CFLAGS

我记得读过一些关于如何编写 Makefile 以便可以添加“外部”选项等内容的内容,但我不知道这些 makefile 是否会以这种能力生成(应该是因为它是 automake),或者这些是如何生成的无论如何都给出了外部选项!

我猜是这样的:

make CFLAGS=-g

应该这样做,但老实说不知道。


编辑:请注意,我实际上对构建内核模块时要包含的-g 标志感兴趣。我不能使用尝试和错误(例如我上面的命令)来查看是否有效,因为内核构建只打印 [CC] ... 而不显示任何选项!

编辑:其实我确实试过了,但gdb ./module.ko 仍然声称没有调试符号。

【问题讨论】:

如果内核(模块)内部发生崩溃,则错误出在内核模块中的可能性很大(100%)。 (我不是内核黑客)内核调试不同。候选清单:模块是否加载?它是否对它获得的参数执行参数验证(来自内核或通过系统调用/ioctls)?它是否尊重内核空间和用户空间之间的内存屏障? @wildplasser,我知道。我在自己的内核模块上花了一周的时间才怀疑另一个(顺便说一下是 RTAI)。最后,我想出了一个非常简单的内核模块,它只使用了显示完全相同行为的 RTAI 函数。所以它真的不能由我自己的模块的错。 我什至不知道 RTAI 模块是什么,所以我恐怕帮不了你。大多数人从复制其他模块开始的机会似乎很大。添加到候选名单:竞争和锁定(提示:在单核机器上测试,尽管这不会避免所有可能的竞争)。祝你好运。 这是 Linux 内核问题吧?我的意思是,您正在尝试调试可加载模块,所以我添加了必要的标签。 @JeremyP,尤其是我的问题,是的,但我正在寻找更通用的答案。也就是说,我正在尝试找到一种方法将选项(可能通过EXTRA_CFLAGS)提供给***make,并在整个构建过程中获得选项。 【参考方案1】:

configure 脚本吗?如果是这样,它是由 autoconf 创建的吗? (可能。)那你就可以了

./configure CFLAGS='-g -O0'
make clean
make

在调试和优化关闭的情况下重建整个事物。

否则,除非您提供 makefile 的相关摘录,否则没有人可以真正帮助您。

【讨论】:

有一个配置脚本。 RTAI 使用类似于内核的配置,但一旦完成,它就会运行配置脚本。我可以在 RTAI 自己的 Makefile 中找到它的调用位置。

以上是关于如何在整个项目(由其他人创建)中添加标志(例如-g)?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用命令行将“其他链接器标志”添加到 xcode 项目?

Qt 创建者平台代码生成标志

如何添加我的功能并在控制器中正确使用它?

不使用-v标志而忽略字符串

链接程序时是不是需要重复编译标志?

在 QT 创建者中,如何自动为 cpp 文件或整个项目中的所有方法添加断点?