我正在尝试为我的Nexus One进行内核调试,并且已经按照http://bootloader.wikidot.com/android:kgdb的说明进行操作.我想知道是否有人真的让这个工作?有没有人为使用KGDB调试内核做了更新的解决方案?
我ARMv7用作目标机器.我已经2.6.34.13为目标编译了Linux源代码.
Target使用minicom通过串口连接Host(Linux Development machine).
Target加载了新内核,并在命令提示符下启用了KGDB.
$ echo ttyAMA0 > /sys/module/kgdboc/parameters/kgdboc
$ echo g > /proc/sysrq-trigger
Run Code Online (Sandbox Code Playgroud)
显示输入KGDB ...消息并等待命令.
在主机方面,
$arm-none-linux-gnueabi-gdb vmlinux
gdb > set remotebaud 115200
gdb > set debug remote 1
gdb > target remote /dev/ttyS0
Run Code Online (Sandbox Code Playgroud)
在此之后,默认情况下会发生一些命令通信.
qSupported从主机发送到目标.但目标不支持qSuppoted,因此返回$#00.同样?,HC-1发送命令但收到适当的响应.
但qOffsets命令没有收到目标的任何响应.
我怀疑是vmlinux.因为如果我放弃listgdb,它就不会显示10行代码
arch/arm/kernel/head.S : No such file or directory.
Run Code Online (Sandbox Code Playgroud)
注意::在服务器中完成的内核编译.因此在开发机器中没有可用的源.但看起来,arm-gdb正在寻找头部.
我不确定我在做什么错.我需要为整个内核加载符号.在这方面指导我.
我目前正在使用 KGDB 调试内核代码。每当我闯入时,我都会自然地跳转到 kgdb 的中断处理程序。在 GDB 下我运行了以下命令。
info threads
Run Code Online (Sandbox Code Playgroud)
输出将是
7 Thread 7 (rcu_sched) 0x0000000000000000 in irq_stack_union ()
6 Thread 5 (kworker/0:0H) 0x0000000000000000 in irq_stack_union ()
5 Thread 3 (ksoftirqd/0) 0x0000000000000000 in irq_stack_union ()
4 Thread 2 (kthreadd) 0x0000000000000000 in irq_stack_union ()
3 Thread 1 (init) 0x0000000000000000 in irq_stack_union ()
2 Thread 3754 (Xorg) 0x0000000000000000 in irq_stack_union ()
* 1 Thread 4294967294 (shadowCPU0) kgdb_breakpoint ()
at kernel/debug/debug_core.c:1042
Run Code Online (Sandbox Code Playgroud)
然后我会跳过代码,期望最终在不同的线程中结束(我对 Xorg 感兴趣),但是在我单步执行代码后,下一个执行线程将变为 cpu 空闲状态。
info thread
* 1 Thread 4294967294 (shadowCPU0) cpu_idle_loop …Run Code Online (Sandbox Code Playgroud) 我读了两者的描述,但我还不明白其中的区别.任何人都可以帮我理解差异吗?
set solib-absolute-prefix -
Specifies the local directory that contains copies of target libraries in the
corresponding subdirectories. This option is useful when debugging with gdbserver.
Run Code Online (Sandbox Code Playgroud)
.
set solib-search-path command -
Specifies directories where GDB will search for shared libraries with symbols. This option
is useful when debugging with gdbserver.
Run Code Online (Sandbox Code Playgroud)
谢谢.
我想通过串口ttyS0从我的64位suse机器调试MIPS linux驱动程序.使用的gdb通过LAN调试应用程序而不是kgdb over serial.我使用此页面和其他一些内容来启动调试,但没有最终结果.
我的内核使用以下设置编译:
CONFIG_MAGIC_SYSRQ=y
CONFIG_HAVE_ARCH_KGDB=y
CONFIG_KGDB=y
CONFIG_KGDB_SERIAL_CONSOLE=y
# CONFIG_KGDB_TESTS is not set
CONFIG_CMDLINE="kgdboc=ttyS0,115200"
Run Code Online (Sandbox Code Playgroud)
如果我运行gdb:
gdb vmlinux
(gdb) set remotebaud 115200
(gdb) set debug remote 1
(gdb) target remote /dev/ttyS0
Run Code Online (Sandbox Code Playgroud)
我可以观察以下输出:
输出(GDB_TERMINAL):
(gdb) target remote /dev/ttyS0
Remote debugging using /dev/ttyS0
Sending packet: $qSupported:qRelocInsn+#9a...Ack
Timeout in mid-packet, retrying
Timed out.
Timed out.
Ignoring packet error, continuing...
Packet qSupported (supported-packets) is supported
warning: unrecognized item "qSupported:qRelocIns" in "qSupported" response
Sending packet: $Hg0#df...Nak
Sending packet: $Hg0#df...Ack
Packet received: Hg0
Sending …Run Code Online (Sandbox Code Playgroud) 似乎该主题没有一个很好的完整的一处文档。
这是没有任何解决方案的参考。任何人都可以贡献自己的知识,以了解如何在Linux内核和Android平台中进行调试和跟踪。
我正在尝试设置 linux 内核模块调试,使用两台机器 - 目标和主机。在目标机器上,我已经编译并安装了一个带有CONFIG_MAGIC_SYSRQ=y标志和其他标志的 3.5.0 内核,用于串行控制台调试。
当我想破坏内核以附加远程 gdb 时,我使用
$ echo g > /proc/sysrq-trigger
Run Code Online (Sandbox Code Playgroud)
但是上面的命令并没有破坏内核。
$ cat /proc/sys/kernel/sysrq"
Run Code Online (Sandbox Code Playgroud)
上面的命令返回 1,因此启用了魔法 sysrq 键。甚至“echo b > /proc/sysrq-trigger”也在工作并重新启动机器。有人可以指出我可能遗漏了什么吗?
谢谢
我试图破解/理解nullfs内核模块(在FreeBSD上)所以为此,我做了以下事情:
在目标机器上:
kldstat给出:
Id Refs Address Size Name
1 10 0xffffffff80200000 17e10c8 kernel
2 1 0xffffffff819e2000 4cf0 vmxnet.ko
3 1 0xffffffff819e7000 16e0 echo.ko
4 1 0xffffffff81c11000 23dc vmmemctl.ko
5 1 0xffffffff81c14000 641b nullfs.ko
nm /boot/kernel/nullfs.ko | grep mount
00000000000018f0 t null_getwritemount
0000000000000540 t nullfs_mount
0000000000000930 t nullfs_unmount
U vfs_mountedfrom
U vop_getwritemount_desc
Run Code Online (Sandbox Code Playgroud)
在通过充当串行控制台的命名管道(我正在使用虚拟机)连接到目标的本地计算机上:
(kgdb) tr0
kdb_sysctl_enter (oidp=<value optimized out>, arg1=<value optimized out>,
arg2=0xfffffe004e7cc7f0,
req=<value optimized out>) at /usr/src/sys/kern/subr_kdb.c:446
446 kdb_why = KDB_WHY_UNSET;
Current language: auto; currently minimal
(kgdb) getsyms
During …Run Code Online (Sandbox Code Playgroud) 我遇到主机和目标之间的串行和USB连接问题.以下是我的设置.主机和目标都没有任何串行(DB9)端口.
主持人:运行Windows + VMshare + Ubuntu
目标:运行Linux内核3.19.有一个MINI USB端口充当串口,我认为它(CP210x uart到usb)
连接1:主机(USB到DB9 male-PL2303)+ DB9母对母+(DB9公对USB)目标.
连接2:主机(USB) - 电缆 - (USB mini)目标
主机(ubuntu VM),可以将USB设备(两种连接类型)识别为/ dev/ttyUSB0.由于VM接管设备控制,因此设备未显示在Windows设备管理器上.
目标引导进入UEFI shell.我修改syslinux.cfg文件,将"kgdbwait kgdboc = ttyS0,115200"附加到APPEND标志.保存更改(按F2)然后退出(按F3).启动进入图像.Target现在使用以下消息进入kdb提示符
kgdb: Waiting for connection from remote gdb...
Entering kdb ( current= <64bit address>, pid 1) on processor 0 due to Keyboard Entry
Kgdb > _
Run Code Online (Sandbox Code Playgroud)
在主机端,我执行以下命令,下面是错误
root@ubuntu: cd /images
root@ubuntu: sudo gdb ./vmlinux
Reading symbols from ./vmlinux done.
(gdb)
(gdb) target remote /dev/ttyUSB0
Remote debugging using /dev/ttyUSB0
Ignoring packet error, continuing...
warning: unrecognized item …Run Code Online (Sandbox Code Playgroud)