如何防止某些值在 linux 内核调试中被优化掉?
how to prevent some values from being optimized out in linux kernel debugging?
这是 linux (5.4.21)
中的代码
当我使用虚拟机并将 gdb 连接到 linux 进程时,我可以使用断点并跟随代码。例如,我在函数 arm_smmu_device_probe 上设置了断点。当我执行 'next' 命令时,我看到一些值,例如下面的 'smmu' 或 'dev' 显示已被优化掉。我怎样才能使它们不被优化,以便我可以在 gdb 中看到它们?
static int arm_smmu_device_probe(struct platform_device *pdev)
{
int irq, ret;
struct resource *res;
resource_size_t ioaddr;
struct arm_smmu_device *smmu;
struct device *dev = &pdev->dev;
bool bypass;
smmu = devm_kzalloc(dev, sizeof(*smmu), GFP_KERNEL);
if (!smmu) {
dev_err(dev, "failed to allocate arm_smmu_device\n");
return -ENOMEM;
}
smmu->dev = dev;
if (dev->of_node) {
ret = arm_smmu_device_dt_probe(pdev, smmu);
} else {
ret = arm_smmu_device_acpi_probe(pdev, smmu);
if (ret == -ENODEV)
return ret;
}
我尝试在顶部 Makefile 中将 -O2 更改为 -Og,但内核构建失败。
最近我找到了如何做到这一点。 (来自Is there a way to tell GCC not to optimise a particular piece of code?,flolo 的回答)
如果你想让一个函数 aaa(...) 不被优化,你可以这样做。
#pragma GCC push_options
#pragma GCC optimize ("O0")
aaa ( ... )
{
function body
}
#prgma GCC pop_options
在某些情况下,这种放置#pragma 会导致#include 头文件和函数源代码之间出现一些差异。所以在这种情况下(不经常)你需要在相应的#include 语句周围添加这个#praga。如果 linux/bbb.h 导致此类问题,请执行此操作。
#pragma GCC push_options
#pragma GCC optimize ("O0")
#include <linux/bbb.h>
#pragma GCC pop_options
这确实有效,我很享受(?)debug/analysis这种方式。
这是 linux (5.4.21)
中的代码
当我使用虚拟机并将 gdb 连接到 linux 进程时,我可以使用断点并跟随代码。例如,我在函数 arm_smmu_device_probe 上设置了断点。当我执行 'next' 命令时,我看到一些值,例如下面的 'smmu' 或 'dev' 显示已被优化掉。我怎样才能使它们不被优化,以便我可以在 gdb 中看到它们?
static int arm_smmu_device_probe(struct platform_device *pdev)
{
int irq, ret;
struct resource *res;
resource_size_t ioaddr;
struct arm_smmu_device *smmu;
struct device *dev = &pdev->dev;
bool bypass;
smmu = devm_kzalloc(dev, sizeof(*smmu), GFP_KERNEL);
if (!smmu) {
dev_err(dev, "failed to allocate arm_smmu_device\n");
return -ENOMEM;
}
smmu->dev = dev;
if (dev->of_node) {
ret = arm_smmu_device_dt_probe(pdev, smmu);
} else {
ret = arm_smmu_device_acpi_probe(pdev, smmu);
if (ret == -ENODEV)
return ret;
}
我尝试在顶部 Makefile 中将 -O2 更改为 -Og,但内核构建失败。
最近我找到了如何做到这一点。 (来自Is there a way to tell GCC not to optimise a particular piece of code?,flolo 的回答)
如果你想让一个函数 aaa(...) 不被优化,你可以这样做。
#pragma GCC push_options
#pragma GCC optimize ("O0")
aaa ( ... )
{
function body
}
#prgma GCC pop_options
在某些情况下,这种放置#pragma 会导致#include 头文件和函数源代码之间出现一些差异。所以在这种情况下(不经常)你需要在相应的#include 语句周围添加这个#praga。如果 linux/bbb.h 导致此类问题,请执行此操作。
#pragma GCC push_options
#pragma GCC optimize ("O0")
#include <linux/bbb.h>
#pragma GCC pop_options
这确实有效,我很享受(?)debug/analysis这种方式。