Linux内核远程调试:无法分解回调试器

时间:2015-03-19 15:51:33

标签: linux debugging gdb kernel kgdb

我正在使用kgdb / remote gdb调试linux ubuntu内核。我有2台电脑 - ubuntu目标和Windows主机。计算机使用串行端口和零调制解调器电缆连接。

在目标ubuntu系统中启用了KGDB支持,KGDB的命令选项:

kgdbwait kgdboc=ttyS0,115200

在我的Windows系统上,我有MinGW gdb build(x86_64):

  

GNU gdb(GDB)7.4版权所有(C)2012 Free Software Foundation,Inc。   此GDB配置为" x86_64-w64-mingw32"。

我启动目标系统并等待直到远程调试器连接。我在GDB窗口中输入以下命令:

(gdb) set remotebaud 115200                                                
(gdb) target remote COM4

我的gdb能够连接到目标并打印以下内容:

  

使用COM4进行远程调试
     ???()at kernel / debug / debug_core.c:1043 wmb(); / *断点后的同步点* /

然后我输入命令来设置断点,以便在启动操作系统时返回到gdb:

(gdb) b sys_sync
  

断点1在0xffffffff8124a710

我还在同一设置的另一次运行中尝试了硬件辅助断点:

(gdb) hbreak sys_sync

当我从目标ubuntu控制台输入sync命令时,这个断点设置应该导致内核beak回到debuger。

我在GDB中继续点击后,操作系统启动正常,但我无法将控制权恢复到gdb。我尝试在sys_sync上设置断点,我试过

echo g > /proc/sysrq-trigger

在所有情况下都没有成功。

非常有趣:如果我最初没有在sys_sync中设置断点,则稍后输入sync命令不会执行任何操作。如果我设置sys_sync断点,稍后输入sync命令会完全停止目标计算机 - 所以我想在这种情况下实际设置了断点。

如何进入调试器? GDB对任何CTrl-C命令都没有反应,因此在我最初点击继续之后无法继续进行调试。

可能是架构不兼容(Windows gdb - Linux目标) - 但似乎确实设置了断点。

请帮忙

2 个答案:

答案 0 :(得分:0)

在您的测试计算机上:以超级用户身份登录。

sudo su

然后生成sysrq-trigger

echo g > /proc/sysrq-trigger

在此之后,您的目标机器应该冻结,但开发机器应该进入目标。

答案 1 :(得分:0)

降低两端的波特率。根据我的经验,虽然理论上支持115200波特率,但它很少能正常工作。我建议将波特率降低到9600(两端),并找到成功。一旦达到目标,您就可以一步一步地提高速度。我很少能够让kgdb在34K波特之外可靠地工作,并且通常更低。我还确保使用正确的RTS / CTS交叉连接器,一些商店购买,一些手工制作。它永远不会重要,我认为问题是SUT端的kgdboc中的一些问题并不总是以115200波特率工作。解决办法就是将波特率降低到9600.数据很小,因此较低的速度不会对任何事情造成任何伤害,并且让它可靠地运行是值得的任何速度惩罚。