zoukankan      html  css  js  c++  java
  • 简单使用GDB

    不多讲,用printf的方式真的很让人崩溃啊。。。尤其是刚开始就连一句printf的没添加过的,你更是伤不起。。。

    初次使用,更高级功能慢慢挖掘。

    首先,要在编译的时候加上-g开关,我这里用的

    gcc -g update0803.c -o update

    如果不加-g开关,用GDB打开文件的时候会提示找不到symbol。

    然后就可以开始找哪一句出现segment fault了...

    1、用gdb打开需调试的可执行文件,或者用 file 指定包含 symbol 的二进制文件

    gdb update

    2、对照自己的code,要在哪一行添加 breakpoint。比如,我需要在217行家break。

    break 217 or b 217

    另,断点可以用行号,也可以用函数的名字。暂时知道这两种方法。

    此外,可以使info b 来查看设置了哪些断点。还可以delete 编号 来删除断点

    可以用 list(缩写 l )来查看源文件内容

    。。。。加上所有你想加的break,go on

    run

    如果你的程序已经在 run 了——比如远程调试,gdbserver 已经在 run 程序了,那么,继续执行,就需要用 continue( 缩写 c )。

    3、到达断点之后,单步调试step,或者简写的s

    step or s

    单步调试也可以用next(简写n)。与step不同的是,step是单步,next是下一行;next的下一行是指代码里的下一行,并不进如函数

    另外,stepi,nexti是这两个命令的扩展,i表示一次运行的行数,比如,要一次运行下面5行,就直接step5

    4、到达指定的断点要干什么呢?当然是要看变量的值,观察变量的值,用print,简写做p。比如,我要打印struct filelist下的filename字符串。

    p flielist->filename

    5、我们只是观察循环了的某条语句,不可能把循环里的每条语句都step一遍吧?所以,很快走完下一个循环的命令就是continue,简写作c

    6、退出用命令quit,简写作q

    7、重新载入文件,用file xxxx,xxxx就是你要调试的可执行文件名字,比如,我把上面的update又重新编译了一遍,然后重新载入

    file update

    然后,又设断点,运行,查看。。。今天先初步接触,总比一句句添加printf强。

    补充:

    当我们的二进制文件是由多个文件编译而来。那么,我们设置断点的时候,在行之前,指定文件名即可,比如,在 mainobject.cpp 的第 7 行设置断点:

     br mainobject.cpp:7

    同样,我们不确定到底在多少行时,可以用先用 list 来查看一下:

     l  mainobject.cpp:7

    小技巧,执行 list 时,可以直接按 enter,来接着查看接下来的行。

    补充2:

    gdb 中,还可以使用 disassamble 来查看汇编代码,并设置断点,如下:

    [root@test opt]# gcc test.c -o ./static -static
    [root@test opt]# gdb ./static
    (gdb) disassemble main
    0x08048204 <main+0>:    push   %ebp
    0x08048205 <main+1>:    mov    %esp,%ebp
    0x08048207 <main+3>:    sub    $0x8,%esp
    0x0804820a <main+6>:    and    $0xfffffff0,%esp
    0x0804820d <main+9>:    mov    $0x0,%eax
    0x08048212 <main+14>:   sub    %eax,%esp
    0x08048214 <main+16>:   call   0x804cb20 <__getuid>
    0x08048219 <main+21>:   leave
    0x0804821a <main+22>:   ret
    (gdb) b *0x08048207

    上面是在二进制 0x08048207 位置,设置了断点。

    ——————
    无论在哪里做什么,只要坚持服务、创新、创造价值,其他的东西自然都会来的。
  • 相关阅读:
    谨以此文纪念一周的心血历程
    面向对象初调用:foolish 电梯
    洛谷 1016 旅行家的预算
    洛谷 1514 引水入城
    洛谷 3178 树上操作
    洛谷 3811 【模板】乘法逆元
    洛谷 1156 垃圾陷阱
    洛谷 1363 幻想迷宫
    洛谷 1736 创意吃鱼法
    洛谷 1436 棋盘分割
  • 原文地址:https://www.cnblogs.com/pied/p/2133938.html
Copyright © 2011-2022 走看看