我已经在amd和intel机器上的ubuntu上编译了kernel 3.13.0-55。我试图将编译后的内核复制到英特尔目标,但它不会用那个启动。因此,我在那个英特尔上编译了相同版本的内核。我可以在英特尔上运行这个内核,英特尔会等待kgdb连接到它。我在AMD上用
target remote /dev/ttyS0
我可以通过串行连接进入内核代码。然后我继续,如果我设置了一些断点,例如在
vfs_read
处,那么是-它被击中。但是,当我在目标intel上向/proc/sysrq触发器写入g时,在主机上的gdb中键入continue并继续运行intel之后,目标将停止,并且我不能再将控件返回到amd上运行的调试器。将g写入/proc/sysrq触发器将停止英特尔,但控制不会返回到amd gdb。我怀疑这可能是由于内核的版本不完全相同(不是复制的),但从目标计算机复制的内核版本也不会更改此行为。我应该如何解决这个问题?如何将控件返回到调试器?我可以测试/验证/检查什么?你还需要什么信息?请告诉我。在内核配置中设置了enable magic sysrq。
uname -a:
AMD: 3.13.11-ckt20 #5 SMP Tue Jun 30 17:52:33 BST 2015 x86_64 x86_64 x86_64 GNU/Linux
Intel: 3.13.11-ckt20 #2 SMP Tue Jun 30 17:10:47 BST 2015 x86_64 x86_64 x86_64 GNU/Linux
GDB评估:
peter@peterubuntu0:~/kernel$ sudo gdb vmlinux_intel
Reading symbols from vmlinux_intel...done.
(gdb) set serial baud 115200
(gdb) set debug remote 1
(gdb) target remote /dev/ttyS0
Remote debugging using /dev/ttyS0
Sending packet: $qSupported:multiprocess+;xmlRegisters=i386;qRelocInsn+#b5...Ack
Packet received:
Packet qSupported (supported-packets) is NOT supported
Sending packet: $Hg0#df...Ack
Packet received: OK
Sending packet: $qTStatus#49...Ack
Packet received:
Packet qTStatus (trace-status) is NOT supported
Sending packet: $?#3f...Ack
Packet received: S05
Sending packet: $Hc-1#09...Ack
Packet received: OK
Sending packet: $qC#b4...Ack
Packet received: QC01
Sending packet: $qAttached#8f...Ack
Packet received:
Packet qAttached (query-attached) is NOT supported
Sending packet: $qOffsets#4b...Ack
Packet received:
Sending packet: $g#67...Ack
Packet received: 2f000000000000000000000000000000a80b0000000000006c1c0000000000006c1c000000000000460200000000000038de8b260388ffff38de8b260388ffff960000000000000022020000000000000100000000000000aaaaaa00000000002084ca81ffffffffe30000000000000000000000000000000000000000000000f4201081ffffffff0202000010000000000000000000000000000000
kgdb_breakpoint () at kernel/debug/debug_core.c:1042
1042 wmb(); /* Sync point after breakpoint */
Sending packet: $qSymbol::#5b...Ack
Packet received:
Packet qSymbol (symbol-lookup) is NOT supported
(gdb) c
Continuing.
Sending packet: $vCont?#49...Ack
Packet received:
Packet vCont (verbose-resume) is NOT supported
Sending packet: $Hc0#db...Ack
Packet received: OK
Sending packet: $c#63...Ack
^Casync_remote_interrupt called // this is where I did Ctrl+C
remote_stop called
^Casync_remote_interrupt_twice called // and Ctrl-C again
Interrupted while waiting for the program.
Give up (and stop debugging it)? (y or n) y
Quit
编辑:
不过,当我尝试从AMD调试Intel时,它不起作用(两个都运行相同的内核3.13.11-CKT20 SMP 2015 x86_64 x86_64 x86_64 GNU/Linux
)以下内容:
目标-Intel(R)Core(TM)2双核CPU E8500@3.16GHz
主机-AMD FX(TM)-4100四核处理器
它的工作方向相反:
目标-AMD FX(TM)-4100四核处理器
主机-Intel(R)Core(TM)2双核CPU E8500@3.16GHz
可能与硬件断点、寄存器、CPU实现有关?
最佳答案
设置断点并继续写入时,可以对gdb执行ctrl+c来写入新命令,例如:info registers
以查看从开始到断点的寄存器状态。
或者使用qemu和gdb进行测试。你可以用Qemu -s -S
,qemu将监听localhost:1234
然后在gdb中使用target remote localhost:1234
如果从gdb内部调用qemu,可能需要跳过sigusr1(“handle sigusr1 noprint”)。
您还可以使用-gdb选项(或-s快捷方式)调用qemu
提供GDB存根。然后您可以从
网络(启动gdb,然后使用“目标远程:”)。见
有关详细信息,请参阅手册页。
根据您尝试调试的内容,使用-s可能会有所帮助
qemu的选项(启动时冻结cpu),这样就可以得到qemu
上,连接gdb并设置它,然后继续。
在某些架构上,使用硬件断点(gdb hbreak命令)
可能比软件断点工作得更好(gdb break命令)
关于c - 从AMD主机调试在Intel目标上运行的linux内核-如何将控制权返还给gdb?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31162843/