⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linux 系统内核的调试.htm

📁 linux 内核调试.rar linux 内核调试.rar
💻 HTM
📖 第 1 页 / 共 5 页
字号:
                          <TR>
                            <TD><PRE><CODE>
stty ispeed 115200 ospeed 115200 -F /dev/ttyS0
</CODE></PRE></TD></TR></TBODY></TABLE><BR>
                        <DIV>在developement机上执行:</DIV><BR><A 
                        name=IDACVYMB><B></B></A><BR>
                        <TABLE cellSpacing=0 cellPadding=5 width="100%" 
                        bgColor=#eeeeee border=1>
                          <TBODY>
                          <TR>
                            <TD><PRE><CODE>
echo hello &gt; /dev/ttyS0
</CODE></PRE></TD></TR></TBODY></TABLE><BR>
                        <DIV>在target机上执行:</DIV><BR><A 
                        name=IDAKVYMB><B></B></A><BR>
                        <TABLE cellSpacing=0 cellPadding=5 width="100%" 
                        bgColor=#eeeeee border=1>
                          <TBODY>
                          <TR>
                            <TD><PRE><CODE>
cat /dev/ttyS0
</CODE></PRE></TD></TR></TBODY></TABLE><BR>
                        <DIV>如果串口连接没问题的话在将在target机的屏幕上显示"hello"。</DIV>
                        <DIV><B>2.2.2 安装与配置</B></DIV>
                        <DIV>下面我们需要应用kgdb补丁到Linux内核,设置内核选项并编译内核。这方面的资料相对较少,笔者这里给出详细的介绍。下面的工作在开发机(developement)上进行,以上面介绍的试验环境为例,某些具体步骤在实际的环境中可能要做适当的改动:</DIV>
                        <DIV>I、内核的配置与编译</DIV><BR><A 
name=IDAWVYMB><B></B></A><BR>
                        <TABLE cellSpacing=0 cellPadding=5 width="100%" 
                        bgColor=#eeeeee border=1>
                          <TBODY>
                          <TR>
                            <TD><PRE><CODE>
[root@lisl tmp]# tar -jxvf linux-2.6.7.tar.bz2
[root@lisl tmp]#tar -jxvf linux-2.6.7-kgdb-2.2.tar.tar
[root@lisl tmp]#cd inux-2.6.7
</CODE></PRE></TD></TR></TBODY></TABLE><BR>
                        <DIV>请参照目录补丁包中文件README给出的说明,执行对应体系结构的补丁程序。由于试验在i386体系结构上完成,所以只需要安装一下补丁:core-lite.patch、i386-lite.patch、8250.patch、eth.patch、core.patch、i386.patch。应用补丁文件时,请遵循kgdb软件包内series文件所指定的顺序,否则可能会带来预想不到的问题。eth.patch文件是选择以太网口作为调试的连接端口时需要运用的补丁</DIV>。 

                        <DIV>应用补丁的命令如下所示:</DIV><BR><A 
                        name=IDAAWYMB><B></B></A><BR>
                        <TABLE cellSpacing=0 cellPadding=5 width="100%" 
                        bgColor=#eeeeee border=1>
                          <TBODY>
                          <TR>
                            <TD><PRE><CODE>
[root@lisl tmp]#patch -p1 &lt;../linux-2.6.7-kgdb-2.2/core-lite.patch 
</CODE></PRE></TD></TR></TBODY></TABLE><BR>
                        <DIV>如果内核正确,那么应用补丁时应该不会出现任何问题(不会产生*.rej文件)。为Linux内核添加了补丁之后,需要进行内核的配置。内核的配置可以按照你的习惯选择配置Linux内核的任意一种方式。</DIV><BR><A 
                        name=IDAIWYMB><B></B></A><BR>
                        <TABLE cellSpacing=0 cellPadding=5 width="100%" 
                        bgColor=#eeeeee border=1>
                          <TBODY>
                          <TR>
                            <TD><PRE><CODE>
[root@lisl tmp]#make menuconfig
</CODE></PRE></TD></TR></TBODY></TABLE><BR>
                        <DIV>在内核配置菜单的Kernel hacking选项中选择kgdb调试项,例如:</DIV><BR><A 
                        name=IDAQWYMB><B></B></A><BR>
                        <TABLE cellSpacing=0 cellPadding=5 width="100%" 
                        bgColor=#eeeeee border=1>
                          <TBODY>
                          <TR>
                            <TD><PRE><CODE>
  [*] KGDB: kernel debugging with remote gdb                                                             
       Method for KGDB communication (KGDB: On generic serial port (8250))  ---&gt;  
  [*] KGDB: Thread analysis                                                                            
  [*] KGDB: Console messages through gdb
[root@lisl tmp]#make
  </CODE></PRE></TD></TR></TBODY></TABLE><BR>
                        <DIV>编译内核之前请注意Linux目录下Makefile中的优化选项,默认的Linux内核的编译都以-O2的优化级别进行。在这个优化级别之下,编译器要对内核中的某些代码的执行顺序进行改动,所以在调试时会出现程序运行与代码顺序不一致的情况。可以把Makefile中的-O2选项改为-O,但不可去掉-O,否则编译会出问题。为了使编译后的内核带有调试信息,注意在编译内核的时候需要加上-g选项。</DIV>
                        <DIV>不过,当选择"Kernel debugging-&gt;Compile the kernel with 
                        debug info"选项后配置系统将自动打开调试选项。另外,选择"kernel debugging with 
                        remote gdb"后,配置系统将自动打开"Compile the kernel with debug 
                        info"选项。</DIV>
                        <DIV>内核编译完成后,使用scp命令进行将相关文件拷贝到target机上(当然也可以使用其它的网络工具,如rcp)。</DIV><BR><A 
                        name=IDA0WYMB><B></B></A><BR>
                        <TABLE cellSpacing=0 cellPadding=5 width="100%" 
                        bgColor=#eeeeee border=1>
                          <TBODY>
                          <TR>
                            <TD><PRE><CODE>
[root@lisl tmp]#scp arch/i386/boot/bzImage root@192.168.6.13:/boot/vmlinuz-2.6.7-kgdb
[root@lisl tmp]#scp System.map root@192.168.6.13:/boot/System.map-2.6.7-kgdb
</CODE></PRE></TD></TR></TBODY></TABLE><BR>
                        <DIV>如果系统启动使所需要的某些设备驱动没有编译进内核的情况下,那么还需要执行如下操作:</DIV><BR><A 
                        name=IDACXYMB><B></B></A><BR>
                        <TABLE cellSpacing=0 cellPadding=5 width="100%" 
                        bgColor=#eeeeee border=1>
                          <TBODY>
                          <TR>
                            <TD><PRE><CODE>
[root@lisl tmp]#mkinitrd /boot/initrd-2.6.7-kgdb 2.6.7
[root@lisl tmp]#scp initrd-2.6.7-kgdb root@192.168.6.13:/boot/ initrd-2.6.7-kgdb
</CODE></PRE></TD></TR></TBODY></TABLE><BR>
                        <DIV>II、kgdb的启动</DIV>
                        <DIV>在将编译出的内核拷贝的到target机器之后,需要配置系统引导程序,加入内核的启动选项。以下是kgdb内核引导参数的说明:</DIV><BR><A 
                        name=IDAMXYMB><B></B></A><BR><IMG height=309 alt="" 
                        src="Linux 系统内核的调试.files/table2.gif" width=584 
                        border=0><BR>
                        <DIV>如表中所述,在kgdb 
                        2.0版本之后内核的引导参数已经与以前的版本有所不同。使用grub引导程序时,直接将kgdb参数作为内核vmlinuz的引导参数。下面给出引导器的配置示例。</DIV><BR><A 
                        name=IDAZXYMB><B></B></A><BR>
                        <TABLE cellSpacing=0 cellPadding=5 width="100%" 
                        bgColor=#eeeeee border=1>
                          <TBODY>
                          <TR>
                            <TD><PRE><CODE>
title 2.6.7 kgdb
root (hd0,0)
kernel /boot/vmlinuz-2.6.7-kgdb ro root=/dev/hda1 kgdbwait kgdb8250=1,115200
</CODE></PRE></TD></TR></TBODY></TABLE><BR>
                        <DIV>在使用lilo作为引导程序时,需要把kgdb参放在由append修饰的语句中。下面给出使用lilo作为引导器时的配置示例。</DIV><BR><A 
                        name=IDAEAAZB><B></B></A><BR>
                        <TABLE cellSpacing=0 cellPadding=5 width="100%" 
                        bgColor=#eeeeee border=1>
                          <TBODY>
                          <TR>
                            <TD><PRE><CODE>
image=/boot/vmlinuz-2.6.7-kgdb
label=kgdb
    read-only
    root=/dev/hda3
append="gdb gdbttyS=1 gdbbaud=115200"
</CODE></PRE></TD></TR></TBODY></TABLE><BR>
                        <DIV>保存好以上配置后重新启动计算机,选择启动带调试信息的内核,内核将在短暂的运行后在创建init内核线程之前停下来,打印出以下信息,并等待开发机的连接。</DIV>
                        <DIV>Waiting for connection from remote gdb...</DIV>
                        <DIV>在开发机上执行:</DIV><BR><A name=IDAOAAZB><B></B></A><BR>
                        <TABLE cellSpacing=0 cellPadding=5 width="100%" 
                        bgColor=#eeeeee border=1>
                          <TBODY>
                          <TR>
                            <TD><PRE><CODE>
gdb
file vmlinux
set remotebaud 115200
target remote /dev/ttyS0
</CODE></PRE></TD></TR></TBODY></TABLE><BR>
                        <DIV>其中vmlinux是指向源代码目录下编译出来的Linux内核文件的链接,它是没有经过压缩的内核文件,gdb程序从该文件中得到各种符号地址信息。</DIV>
                        <DIV>这样,就与目标机上的kgdb调试接口建立了联系。一旦建立联接之后,对Linux内的调试工作与对普通的运用程序的调试就没有什么区别了。任何时候都可以通过键入ctrl+c打断目标机的执行,进行具体的调试工作。</DIV>
                        <DIV>在kgdb 
                        2.0之前的版本中,编译内核后在arch/i386/kernel目录下还会生成可执行文件gdbstart。将该文件拷贝到target机器的/boot目录下,此时无需更改内核的启动配置文件,直接使用命令:</DIV><BR><A 
                        name=IDAYAAZB><B></B></A><BR>
                        <TABLE cellSpacing=0 cellPadding=5 width="100%" 
                        bgColor=#eeeeee border=1>
                          <TBODY>
                          <TR>
                            <TD><PRE><CODE>
[root@lisl boot]#gdbstart -s 115200 -t /dev/ttyS0
</CODE></PRE></TD></TR></TBODY></TABLE><BR>
                        <DIV>可以在KGDB内核引导启动完成后建立开发机与目标机之间的调试联系。</DIV>
                        <DIV><B>2.2.3 通过网络接口进行调试</B></DIV>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -