你好,游客 登录 注册 搜索
背景:
阅读新闻

Linux 内核调试2-UML调试内核

[日期:2012-07-26] 来源:tech.fancymore.com  作者:cppbreak [字体: ]

今天的特别汗,首先,之前UML在64位系统下没有编译通过,编译器和内核源码都应该不会犯这样低级的错误,那最有可能的原因就是gcc版本和 linux内核版本不匹配,gcc 4.4.4版本算是高版本了,而内核版本2.6.34已非最新,抱着侥幸心里下载了2.6.36版本编译,居然顺利通过,看来64位与32位编译并没什么 区别。

另外一个问题是昨天启动UML失败的问题,原来是我的命令行写错了,ubda指定根文件系统,我错写成了udba,以至无法加载文件系统,经过纠正后的命令如下:

./linux ubda=DSL-4.4-root_fs

#登录之后出现root提示符
root@console[/]#
#关闭UML
root@console[/]# shutdown -h 0

当然这也不存在内核配置错误的问题了,至于根文件系统需要慢慢积累。

接下来看看如何调试内核,由官方文档 Kernel Hacking with UML 所言,直接使用 gdb linux 便可调试,不过我在启动一开始便遇到段错误,单步运行居然还能继续,之后便陷入无休止的trap中。

继续 google(最能找到答案的往往在国外的论坛,而且常常需要翻墙),最后找到两个设置,是SIGSEGV和SIGUSR1信号不中断继续运行,最终居然可以,这点让人百思不得其解,还是先看看现象如何:

$ gdb linux
(gdb) br start_kernel
Breakpoint 1 at 0x80493bb: file init/main.c, line 533.
(gdb) handle SIGSEGV pass nostop noprint
Signal        Stop      Print   Pass to program Description
SIGSEGV       No        No      Yes             Segmentation fault
(gdb) handle SIGUSR1 pass nostop noprint
Signal        Stop      Print   Pass to program Description
SIGUSR1       No        No      Yes             User defined signal 1
(gdb) r ubda=DSL-4.4-root_fs
Starting program: /home/cpp/fox/kernel/linux-2.6.34/linux ubda=DSL-4.4-root_fs
Locating the bottom of the address space ... 0x1000
Locating the top of the address space ... 0xc0000000
Core dump limits :
        soft - 0
        hard - NONE
Checking that ptrace can change system call numbers...OK
Checking syscall emulation patch for ptrace...OK
Checking advanced syscall emulation patch for ptrace...OK
Checking for tmpfs mount on /dev/shm...OK
Checking PROT_EXEC mmap in /dev/shm/...OK
Checking for the skas3 patch in the host:
  - /proc/mm...not found: No such file or directory
  - PTRACE_FAULTINFO...not found
  - PTRACE_LDT...not found
UML running in SKAS0 mode

Breakpoint 1, start_kernel () at init/main.c:533
533             smp_setup_prhandleocessor_id();
(gdb)

# 注释,gdb 启动参数的设置
(gdb) r arg1 arg2 ...
(gdb) set args arg1 arg2 ...
# handle 指定如何处理一个信号,详尽的解释可查阅帮助
(gdb) help handle

居然一切顺利的断到了start_kernel,哈哈,不管如何,总算能够调试内核了。接下来还有UML虚拟机的网络配置,UML使用了一个取巧的方式就是利用 tun 和 iptables ,好在我也研究了大半年,明天继续。

今天唯一不明白的地方在于GDB调试的问题,明明遇到了SIGSEG,为什么还能继续呢?莫非这个信号是自己发出的?还有之后的SEGTRAP信号是怎么发出来的?要弄清楚这个问题,或许还得查阅UML代码。

相关系列文章:
Linux 内核调试1-UML http://www.linuxidc.com/Linux/2012-07/66410.htm
Linux 内核调试2-UML调试内核 http://www.linuxidc.com/Linux/2012-07/66411.htm
Linux 内核调试3-UML网络配置 http://www.linuxidc.com/Linux/2012-07/66412.htm
Linux 内核调试4-Qemu调试Linux内核 http://www.linuxidc.com/Linux/2012-07/66413.htm
Linux 内核调试5-UML和Qemu调试模块 http://www.linuxidc.com/Linux/2012-07/66414.htm
Linux 内核调试6-使用KGDB双机调试 http://www.linuxidc.com/Linux/2012-07/66415.htm

linux
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款