从内核日志中的警告中识别代码

时间:2013-08-03 09:18:43

标签: linux linux-kernel uclinux

在启动我的linux内核时,我得到了这样的日志文件,导致这个以及如何解决..?

------------[ cut here ]------------
WARNING: at drivers/gpio/gpiolib.c:1423 0xa02147ab()
Modules linked in:
Backtrace: no frame pointer
 ---[ end trace ccc3de96c2b87179 ]---
------------[ cut here ]------------
WARNING: at drivers/gpio/gpiolib.c:1423 0xa02147ab()
Modules linked in:
Backtrace: no frame pointer
---[ end trace ccc3de96c2b8717a ]---
------------[ cut here ]------------
WARNING: at drivers/gpio/gpiolib.c:1423 0xa02147ab()
Modules linked in:
Backtrace: no frame pointer
---[ end trace ccc3de96c2b8717b ]---
ds3232 0-0068: rtc core: registered ds3232 as rtc0
i2c-gpio i2c-gpio.0: using pins 27 (SDA) and 28 (SCL)

1 个答案:

答案 0 :(得分:1)

密切注意内核日志中的以下行:
WARNING: at drivers/gpio/gpiolib.c:1423 0xa02147ab()

这表示此打印是从文件1423

的行号drivers/gpio/gpiolib.c触发的
Linux内核中drivers/gpio/gpiolib.c:1423触发

WARN_ON()

int __gpio_get_value(unsigned gpio)
{
        struct gpio_chip        *chip;

        chip = gpio_to_chip(gpio);
        WARN_ON(extra_checks && chip->can_sleep);
        return chip->get ? chip->get(chip, gpio - chip->base) : 0;
}

<子> 注意:上面的代码是(arch = x86上的v2.6.33)。在继续上述分析之前,请确认您确实在x86硬件上运行Linux Kernel v2.6.33。行号随内核版本而变化。您可能会在不同内核版本的同一行上同时遇到WARN_ON()的不同函数。


更新

由于此问题是在与RTC-DS3232外围设备通信时造成的(否则其工作正常),我们可以禁用警告。

执行此操作的一种方法是在Linux内核构建配置中禁用CONFIG_DEBUG。这反过来会禁用gpio驱动程序中的extra_checks

或者,可以在 drivers/gpio/gpiolib.c:34 处覆盖extra_checks的定义,如下所示

/* When debugging, extend minimal trust to callers and platform code.
 * Also emit diagnostic messages that may help initial bringup, when
 * board setup or driver bugs are most common.
 *
 * Otherwise, minimize overhead in what may be bitbanging codepaths.
 */
#ifdef  DEBUG
#define extra_checks    1
#else
#define extra_checks    0
#endif

/* override extra_checks irrespective of debug-mode */
#define extra_checks    0