2

我在 AT91SAM9263 板上进行嵌入式开发并遇到了一个奇怪的问题。它运行 debian Linux 内核 2.6.18.4,并与 arm-linux-gcc 3.4.6 交叉编译,并使用 uClibc-0.9.28 作为 C 库。我正在调试内核设备驱动程序,但 System.map 文件中没有出现特定功能。可以理解的是,因此我无法在其上设置断点。奇怪的是,如果我闯入它的调用函数,我就无法进入它——使用 gdb 的 nexti 命令执行它但跳过源代码。该函数是 atmel_rx_chars(struct uart_port *port)。它是在 atmel_serial.c 中声明的静态 void 函数,其示例出现在 [1] 中。同一文件中还有其他静态 void 函数 (atmel_tx_chars(struct uart_port *port), 例如)在同一个文件中声明并且实际上在 System.map 文件中被索引。根据 [2] “System.map 由 'nm vmlinux' 生成,并且不相关或无趣的符号被剔除。” 我尝试使用 nm(以及 objdump)来查看所有符号,但它仍然没有出现在输出中。但是,当我 grep atmel_rx_chars vmlinux 时,它会返回匹配项。我曾经认为自己是一个超级用户,但在这之后我真的很难过。任何建议将不胜感激。我曾经认为自己是一个超级用户,但在这之后我真的很难过。任何建议将不胜感激。我曾经认为自己是一个超级用户,但在这之后我真的很难过。任何建议将不胜感激。

谢谢,

杰斯

[1] http://lxr.free-electrons.com/source/drivers/serial/atmel_serial.c#L379
[2]http://www.faqs.org/docs/Linux-HOWTO/Kernel-HOWTO.html#systemmap

4

2 回答 2

2

您看不到它的原因是因为编译器正在内联该函数。它被声明为静态的,并且只在一个地方调用,因此编译器将其内联。如果要在其上放置断点,请更改源代码,使其不再声明为静态并重新编译。

于 2010-07-21T16:45:27.637 回答
0

对于任何可能感兴趣的人,我无法弄清楚为什么它不会将 atmel_rx_chars 映射到 System.map 中的地址。您仍然可以正常设置断点以便在这种情况下进行调试。我想当我在寻找答案时应该更明显。无论如何在 gdb 命令行类型中

b source_file.c:line#

所以在这个例子中,它将是

b atmel_serial.c:381

每当您遇到“丢失的”例程时,它就会中断。不过,这仍然是一个不完整的解决方案。进入特定行有效,但不会离开调用函数 (atmel_handle_receive) 的堆栈帧,因此 gdb 无法访问 atmel_rx_chars 的本地变量。与往常一样,我们将不胜感激任何帮助或见解。如果其他人遇到这个问题或类似的问题,希望这可以作为一个很好的起点。

谢谢,

杰斯

于 2010-02-23T21:29:31.347 回答