欢迎大家光临【无师自通-教程网】您的到来是我们的荣幸。本站提供photoshop教程,ps教程,flash教程,cad教程,网页制作教程,excel教程,asp教程,vb教程,3d教程,c语言教程,html教程,coreldraw教程,dreamweaver教程,java教程,3dmax教程 等各种教程为主题的内容和服务,相信您会在这里找到您所需要的东东。无师自通伴您一生-谢谢您的光临!!
网站地图 设为首页
简繁切换 加入收藏
栏目待定 留言本站
您现在的位置: 无师自通-教程网 >> 操作系统 >> Linux >> 入门基础 >> 教程正文

  没有公告

教程: Linux教程-入门课程-gdb (GNU 调试器):基础 更多...
教程: Linux教程-入门课程-gdb (GNU 调试器):基础


摘要
关于调试 Linux 代码的有用技巧(2004-03-02 10:31:01)
By 泛舟, 出处:http://www-900.ibm.com/developerWorks/cn/linux/tips/l-gdb/index2.shtml

   就调试本机可执行文件(即不是 Java* 或 perl 等)而言,使用 gdb 就对了。gdb 可用于源代码级调试,以及跟踪没有源代码的程序或检查某个终止的程序留下的核心文件。遗憾的是,当您从来没有使用过它,或者已经有一段时间没有使用它时,使用它来做这些工作可能很困难。图 1 展示了使用 gdb 来进行调试所需的每个命令。


Command Description
file load program
b set breakpoint
r run
c continue
s step (line)
si step (machine instruction)
n next (step over function call)
finish run until function returns
i r show all registers
i r show specific register
l list source
p display value
set args set command line arguments

图 1

   要将 gdb 用作源代码级调试器,请确保在包括调试符号的情况下编译程序;这就是 gcc 的 -g 选项。对于启动 gdb,您可以通过输入 gdb programname(此例中是 gdb simple),或者通过单独运行 gdb 本身并使用 file 命令加载可执行文件来达到目的。

   要设置基本的断点,您可以在某个函数名称或行号上中断。例如,b 27 将在当前文件的第 27 行上设置了一个断点。有两种使用函数名称的方式:b main 在函数 main 中的第一行可执行代码上中断,b *main 在 main 的入口地址上设置一个断点(如果打算单步调试函数的每条指令,这样是很有用的)。

   一旦设置了第一个断点,可使用 run 或 r 来启动程序并运行到第一个断点。还可以不带任何断点运行程序,如果您不知道程序是在何处崩溃的,这样将很有帮助。当您命中一个断点 c 或 continue 时,程序将恢复执行,直至命中下一个断点。

   step“单步”调试源代码行。Step instruction (si) 单步调试机器代码行(当您单步调试优化过的代码时,si 指令可能特别有用,这将在后面介绍)。 next 工作起来就像 step,但是它不跟踪进入函数调用(如果的确错误地跟踪进入了函数调用,可使用 finish 来完成该函数,然后在它返回的地方中断)。

   单独的 info register(i r)本身显示所有寄存器的值(浮点值除外),不过您可以指定一个寄存器名称。在 31 位系统上,通用寄存器被命名为 gpr0、gpr1、gpr2,等等;在 64 位系统上,它们被命名为 r0、r1、r2,等等。浮点寄存器遵循相同的命名约定:在 31 位系统上是 fpr0、fpr1、fpr2,等等;在 64 位系统上是 f0、f1、f2,等等。

   “l”列出程序当前停止位置周围的源代码。您还可以指定开始列出代码的行号或要列出的函数名称。print 允许您打印程序中任何变量的值。 print 的一个最好的优点在于,它会为您取出一个结构中的所有值,或允许您直接引用该结构的一部分:


Breakpoint 1, main () at simple.c:30
30 boink.boik = &r1;
(gdb) print boink
$3 = {boik = 0x0}
(gdb) print boink.boik
$4 = (int *) 0x0

   最后,set args 为程序设置命令行参数。您也可以在执行 run 时指定命令行参数,但是 set args 将使参数在 run 的多次执行中都有效。


gdb Post Mortem

   当程序意外地终止时,内核会尝试产生一个核心文件,以图判断发生了什么错误。然而,核心文件通常不是在默认设置值下产生的。这可以使用 ulimit 命令来改变。ulimit -c unlimited 帮助确保您获得应用程序的完整核心文件。

   虽然核心文件当前仅提供多线程应用程序中的有限的值,不过 2.5 版的开发内核已开始处理这个问题。预计 2.6 版的内核中会提供一些理想的线程改进。


Command Description
file load program
core load core file
bt back trace
where same as back trace
i f frame information
up move up stack
down move down stack
frame jump to frame
disassem display function's machine code
i locals display local variable values

图 2

   图 2 突出显示了一系列便利的 post mortem 命令。


(gdb) file simple
Reading symbols from simple...done.
(gdb) core core
Core was generated by `./simple'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /lib/libc.so.6...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/ld.so.1...done.
Loaded symbols for /lib/ld.so.1
#0 0x400ab738 in memcpy () from /lib/libc.so.6
(gdb) where
#0 0x400ab738 in memcpy () from /lib/libc.so.6
#1 0x40066e in main () at simple.c:34
#2 0x40041eb8 in __libc_start_main () from /lib/libc.so.6
#3 0x4004ac in _start ()
(gdb) i f
Stack level 0, frame at 0x7ffff7a0:
pswa = 0x400ab738 in memcpy; saved pswa 0x0
(FRAMELESS), called by frame at 0x7ffff7a0
Arglist at 0x7ffff7a0, args:
Locals at 0x7ffff7a0, Previous frame's sp is 0x0
(gdb) up
#1 0x40066e in main () at simple.c:34
34 memcpy (doink.boik, boink.boik, sizeof(boink.boik));
(gdb) i locals
doink = {boik = 0x4019a0}
boink = {boik = 0x0}
(gdb) ptype boink.boik
type = int *
(gdb) print *boink.boik
Cannot access memory at address 0x0
(gdb) print *doink.boik
$1 = 4

图 3

   图 3 简要显示了一个核心程序的完整运行过程。同样,

[1] [2] [3] 下一页

教程录入:admin    责任编辑:admin 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
     
     
     
     

    dos入门教程

    dos入门教程-2

    dos入门教程-1
    免责声明!本站资料大部分来自于互联网,其版权归原作者或其他合法者所有.如内容涉及或侵犯了您的权益,请通知本人,我将尽快处理!.欢迎您的光临。
    辽ICP备07003958号
    无师自通,伴你一生-教程网