精华内容
下载资源
问答
  • 2022-03-10 15:43:11

    1、gdb退出命令:q。安装命令 yum -y install gdb或者sudo apt-get install gdb


    2、如果希望编译后的程序能够可以被调试,编译时要加-g的参数,-g把book的文件信息加到生成的book
    例如gcc -g -o book book.c
    在命令提示符下面输入gdb book就可以调试book程序了


    3、基本调试命令
    命令             命令缩写                  命令说明


    set args                                         设置主程序的参数。
                                                          例如:./book119/oracle/c/book1.c/tmp/book1.c
                                                          设置参数的方法是:
                                                          gdb book119
                                                          (gdb) set args /oracle/c/book1.c/tmp/book1.c


    Break               b                            设置断点,b 20表示在第20行设置断点,可以设置多个断点


    Run                  r                             开始运行程序,程序运行到断点位置就会停下来,如果没有
                                                          遇见断点,程序会一直运行下去。


    Next                 n                             执行当前语句,如果该语句为函数调用,不会进入函数内

                                                           执行


    step                  s                           执行当前行语句,如果该语句是函数调用,则进入函数执行其中
                                                        第一条语句。注意:如果函数是库函数或第三方提供的函数,用s
                                                        也是进不去的,因为没有源代码。如果是自己定义的函数,只要
                                                         有源码就可以进去。


    print                  p                         显示变量值,例如:p name表示显示变量name的值

    continue           c                           继续程序的运行,直到遇见下一个断点

    set var name=v                          设置变量的值,假设程序有两个变量:int ii;char name[21];
                                                       set var ii=10 把ii的值设置为10;
                                                       set var name="西施"把name的值设置为"西施",注意,不是strcpy


    quit                  q                          退出gdb环境。


    4、在gdb环境下面,可以通过上下光标键切换执行过的gdb命令。

    更多相关内容
  • 使用gdb调试core文件,可以帮助我们快速定位程序出现段错误的位置。当然,可执行程序编译时应加上-g编译选项,生成调试信息。 当程序访问的内存超出了系统给定的内存空间,就会产生Segmentation fault (core dumped)...
  • GDB调试手册(中文版)

    2022-01-07 17:31:05
    GDB调试手册,中文版,很适合新手的手册,有基本用法有示例,我一直用着过来的,所以分享一下
  • 第二课:启动 GDB 调试

    千次阅读 2019-03-23 14:37:46
    使用 GDB 调试程序一般有三种方式: gdb filename gdb attach pid gdb filename corename ...在开发阶段或者研究别人的项目时,当编译成功生成目标二进制文件后,可以使用gdb filename直接启动这个程序...

    使用 GDB 调试程序一般有三种方式:

    • gdb filename
    • gdb attach pid
    • gdb filename corename

    这也对应着本节课的核心内容:

    • 直接调试目标程序
    • 附加进程
    • 调试 core 文件

    接下来我们逐一讲解。

    2.1 直接调试目标程序

    在开发阶段或者研究别人的项目时,当编译成功生成目标二进制文件后,可以使用 gdb filename 直接启动这个程序的调试,其中 filename 是需要启动的调试程序文件名,这种方式是直接使用 GDB 启动一个程序进行调试。注意这里说的启动一个程序进行调试其实不严谨,因为实际上只是附加(attach)了一个可执行文件,并没有把程序启动起来;接着需要输入run 命令,程序才会真正的运行起来。关于 run 命令后面的课程中会详细介绍。上一课的 GDB 调试 hello_server 系列就是使用的这种方式。

    假设现在有一个程序叫 fileserver,使用 gdb fileserver 附加该程序,然后使用run 命令启动该程序。如下图所示:

    enter image description here

    2.2 附加进程

    在某些情况下,一个程序已经启动了,我们想调试这个程序,但是又不想重启这个程序。假设有这样一个场景,我们的聊天测试服务器程序正在运行,运行一段时间之后,发现这个聊天服务器不能接受新的客户端连接了,这时肯定是不能重启程序的,如果重启,当前程序的各种状态信息就丢失了。怎么办呢?可以使用gdb attach 进程 ID 来将 GDB 调试器附加到聊天测试服务器程序上。例如,假设聊天程序叫 chatserver,可以使用 ps 命令获取该进程的 PID,然后使用 gdb attach 就可以调试了,操作如下:

    [zhangyl@iZ238vnojlyZ flamingoserver]$ ps -ef | grep chatserver
    zhangyl  21462 21414  0 18:00 pts/2    00:00:00 grep --color=auto chatserver
    zhangyl  26621     1  5 Oct10 ?        2-17:54:42 ./chatserver -d
    

    实际执行如下图所示:

    enter image description here

    通过以上代码得到 chatserver 的 PID 为 26621,然后使用 gdb attach 26621 把 GDB 附加到 chatserver 进程,操作并输出如下:

    [zhangyl@localhost flamingoserver]$ gdb attach 26621
    Attaching to process 26661
    Reading symbols from /home/zhangyl/flamingoserver/chatserver...done.
    Reading symbols from /usr/lib64/mysql/libmysqlclient.so.18...Reading symbols from /usr/lib64/mysql/libmysqlclient.so.18...(no debugging symbols found)...done.
    Reading symbols from /lib64/libpthread.so.0...(no debugging symbols found)...done.
    [New LWP 42931]
    [New LWP 42930]
    [New LWP 42929]
    [New LWP 42928]
    [New LWP 42927]
    [New LWP 42926]
    [New LWP 42925]
    [New LWP 42924]
    [New LWP 42922]
    [Thread debugging using libthread_db enabled]
    Using host libthread_db library "/lib64/libthread_db.so.1".
    Loaded symbols for /lib64/libpthread.so.0
    Reading symbols from /lib64/libc.so.6...(no debugging symbols found)...done.
    

    为了节约篇幅,上述代码中我删掉了一些无关的信息。当提示 “Attaching to process 26621” 时就说明我们已经成功地将 GDB 附加到目标进程了。需要注意的是,程序使用了一些系统库(如 libc.so),由于这是发行版本的 Linux 系统,这些库是没有调试符号的,因而 GDB 会提示找不到这些库的调试符号。因为目的是调试 chatserver,对系统 API 调用的内部实现并不关注,所以这些提示可以不用关注,只要 chatserver 这个文件有调试信息即可。

    当用 gdb attach 上目标进程后,调试器会暂停下来,此时可以使用 continue 命令让程序继续运行,或者加上相应的断点再继续运行程序(这里提到的 continue 命令不熟悉也没有关系,后续会详细介绍这些命令的使用方法)。

    当调试完程序想结束此次调试时,而且不对当前进程 chatserver 有任何影响,也就是说想让这个程序继续运行,可以在 GDB 的命令行界面输入 detach 命令让程序与 GDB 调试器分离,这样 chatserver 就可以继续运行了:

    (gdb) detach
    Detaching from program: /home/zhangyl/flamingoserver/chatserver, process 42921
    

    然后再退出 GDB 就可以了:

    (gdb) quit
    [zhangyl@localhost flamingoserver]$
    

    2.3 调试 core 文件

    有时候,服务器程序运行一段时间后会突然崩溃,这并不是我们希望看到的,需要解决这个问题。只要程序在崩溃的时候有 core 文件产生,就可以使用这个 core 文件来定位崩溃的原因。当然,Linux 系统默认是不开启程序崩溃产生 core 文件这一机制的,我们可以使用 ulimit -c 命令来查看系统是否开启了这一机制。

    顺便提一句,ulimit 这个命令不仅仅可以查看 core 文件生成是否开启,还可以查看其他的一些功能,比如系统允许的最大文件描述符的数量等,具体可以使用 ulimit -a 命令来查看,由于这个内容与本课主题无关,这里不再赘述。

    [zhangyl@localhost flamingoserver]$ ulimit -a
    core file size          (blocks, -c) 0
    data seg size           (kbytes, -d) unlimited
    scheduling priority             (-e) 0
    file size               (blocks, -f) unlimited
    pending signals                 (-i) 15045
    max locked memory       (kbytes, -l) 64
    max memory size         (kbytes, -m) unlimited
    open files                      (-n) 1024
    pipe size            (512 bytes, -p) 8
    POSIX message queues     (bytes, -q) 819200
    real-time priority              (-r) 0
    stack size              (kbytes, -s) 8192
    cpu time               (seconds, -t) unlimited
    max user processes              (-u) 4096
    virtual memory          (kbytes, -v) unlimited
    file locks                      (-x) unlimited
    

    发现 core file size 那一行默认是 0,表示关闭生成 core 文件,可以使用“ulimit 选项名 设置值”来修改。例如,可以将 core 文件生成改成具体某个值(最大允许的字节数),这里我们使用 ulimit -c unlimitedunlimited 是 -c 选项值)直接修改成不限制大小。

    [zhangyl@localhost flamingoserver]$ ulimit -c unlimited
    [zhangyl@localhost flamingoserver]$ ulimit -a
    core file size          (blocks, -c) unlimited
    data seg size           (kbytes, -d) unlimited
    scheduling priority             (-e) 0
    file size               (blocks, -f) unlimited
    pending signals                 (-i) 15045
    max locked memory       (kbytes, -l) 64
    max memory size         (kbytes, -m) unlimited
    open files                      (-n) 1024
    pipe size            (512 bytes, -p) 8
    POSIX message queues     (bytes, -q) 819200
    real-time priority              (-r) 0
    stack size              (kbytes, -s) 8192
    cpu time               (seconds, -t) unlimited
    max user processes              (-u) 4096
    virtual memory          (kbytes, -v) unlimited
    file locks                      (-x) unlimited
    

    注意,这个命令容易记错,第一个 ulimit 是 Linux 命令, -c 选项后面的 unlimited 是选项的值,表示不限制大小,当然也可以改成具体的数值大小。很多初学者在学习这个命令时,总是把 ulimit 命令和 unlimited 取值搞混淆,如果读者能理解其含义,一般就不会混淆了。

    还有一个问题就是,这样修改以后,当我们关闭这个 Linux 会话,设置项的值就会被还原成 0,而服务器程序一般是以后台程序(守护进程)长周期运行,也就是说当前会话虽然被关闭,服务器程序仍然继续在后台运行,这样这个程序在某个时刻崩溃后,是无法产生 core 文件的,这种情形不利于排查问题。因此,我们希望这个选项永久生效,永久生效的方式是把“ulimit -c unlimited”这一行加到 /etc/profile 文件中去,放到这个文件最后一行即可。

    具体的例子

    生成的 core 文件的默认命名方式是 core.pid,举个例子,比如某个程序当时运行时其进程 ID 是 16663,那么它崩溃产生的 core 文件的名称就是 core.16663。我们来看一个具体的例子,某次我发现服务器上的 msg_server 崩溃了,产生了一个如下的 core 文件:

    -rw------- 1 root root 10092544 Sep  9 15:14 core.21985
    

    就可以通过这个 core.21985 文件来排查崩溃的原因,调试 core 文件的命令是:

    gdb filename corename
    

    其中,filename 就是程序名,这里就是 msg_server;corename 是 core.21985,我们输入 gdb msg_server core.21985 来启动调试:

    [root@myaliyun msg_server]# gdb msg_server core.21985
    Reading symbols from /root/teamtalkserver/src/msg_server/msg_server...done.
    [New LWP 21985]
    [Thread debugging using libthread_db enabled]
    Using host libthread_db library "/lib64/libthread_db.so.1".
    Core was generated by `./msg_server -d'.
    Program terminated with signal 11, Segmentation fault.
    #0  0x00000000004ceb1f in std::less<CMsgConn*>::operator() (this=0x2283878, __x=@0x7ffca83563a0: 0x2284430, __y=@0x51: <error reading variable>)
        at /usr/include/c++/4.8.2/bits/stl_function.h:235
    235           { return __x < __y; }
    

    可以看到程序崩溃的地方是在 stl_function.h 的第 235 行,然后通过 bt 命令(后续将详细介绍该命令)查看崩溃时的调用堆栈,进一步分析就能找到崩溃的原因。

    (gdb) bt
    #0  0x00000000004ceb1f in std::less<CMsgConn*>::operator() (this=0x2283878, __x=@0x7ffca83563a0: 0x2284430, __y=@0x51: <error reading variable>)
        at /usr/include/c++/4.8.2/bits/stl_function.h:235
    #1  0x00000000004cdd70 in std::_Rb_tree<CMsgConn*, CMsgConn*, std::_Identity<CMsgConn*>, std::less<CMsgConn*>, std::allocator<CMsgConn*> >::_M_get_insert_unique_pos
        (this=0x2283878, __k=@0x7ffca83563a0: 0x2284430) at /usr/include/c++/4.8.2/bits/stl_tree.h:1324
    #2  0x00000000004cd18a in std::_Rb_tree<CMsgConn*, CMsgConn*, std::_Identity<CMsgConn*>, std::less<CMsgConn*>, std::allocator<CMsgConn*> >::_M_insert_unique<CMsgConn* const&> (this=0x2283878, __v=@0x7ffca83563a0: 0x2284430) at /usr/include/c++/4.8.2/bits/stl_tree.h:1377
    #3  0x00000000004cc8bd in std::set<CMsgConn*, std::less<CMsgConn*>, std::allocator<CMsgConn*> >::insert (this=0x2283878, __x=@0x7ffca83563a0: 0x2284430)
        at /usr/include/c++/4.8.2/bits/stl_set.h:463
    #4  0x00000000004cb011 in CImUser::AddUnValidateMsgConn (this=0x2283820, pMsgConn=0x2284430) at /root/teamtalkserver/src/msg_server/ImUser.h:42
    #5  0x00000000004c64ae in CDBServConn::_HandleValidateResponse (this=0x227f6a0, pPdu=0x22860d0) at /root/teamtalkserver/src/msg_server/DBServConn.cpp:319
    #6  0x00000000004c5e3d in CDBServConn::HandlePdu (this=0x227f6a0, pPdu=0x22860d0) at /root/teamtalkserver/src/msg_server/DBServConn.cpp:203
    #7  0x00000000005022b3 in CImConn::OnRead (this=0x227f6a0) at /root/teamtalkserver/src/base/imconn.cpp:148
    #8  0x0000000000501db3 in imconn_callback (callback_data=0x7f4b20 <g_db_server_conn_map>, msg=3 '\003', handle=8, pParam=0x0)
        at /root/teamtalkserver/src/base/imconn.cpp:47
    #9  0x0000000000504025 in CBaseSocket::OnRead (this=0x227f820) at /root/teamtalkserver/src/base/BaseSocket.cpp:178
    #10 0x0000000000502f8a in CEventDispatch::StartDispatch (this=0x2279990, wait_timeout=100) at /root/teamtalkserver/src/base/EventDispatch.cpp:386
    #11 0x00000000004fddbe in netlib_eventloop (wait_timeout=100) at /root/teamtalkserver/src/base/netlib.cpp:160
    #12 0x00000000004d18c2 in main (argc=2, argv=0x7ffca8359978) at /root/teamtalkserver/src/msg_server/msg_server.cpp:213
    (gdb)
    

    堆栈 #4 就不是库代码了,我们可以排查这里的代码,然后找到问题原因。

    自定义 core 文件名称

    但是细心的读者会发现一个问题:一个正在程序运行时,其 PID 是可以获取到的,但是当程序崩溃后,产生了 core 文件,尤其是多个程序同时崩溃,我们根本没法通过 core 文件名称中的 PID 来区分到底是哪个服务解决这个问题有两个方法:

    • 程序启动时,记录一下自己的 PID
    void writePid()
    {
          uint32_t curPid = (uint32_t) getpid();
          FILE* f = fopen("xxserver.pid", "w");
          assert(f);
          char szPid[32];
          snprintf(szPid, sizeof(szPid), "%d", curPid);
          fwrite(szPid, strlen(szPid), 1, f);
          fclose(f);
    }
    

    我们在程序启动时调用上述 writePID 函数,将程序当时的 PID 记录到xxserver.pid 文件中去,这样当程序崩溃时,可以从这个文件中得到进程当时运行的 PID,这样就可以与默认的 core 文件名后面的 PID 做匹配了。

    • 自定义 core 文件的名称和目录

    /proc/sys/kernel/core_uses_pid 可以控制产生的 core 文件的文件名中是否添加 PID 作为扩展,如果添加则文件内容为 1,否则为 0;/proc/sys/kernel/core_pattern 可以设置格式化的 core 文件保存位置或文件名。修改方式如下:

    echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
    

    各个参数的说明如下:

    参数名称参数含义(英文)参数含义(中文)
    %pinsert pid into filename添加 pid 到 core 文件名中
    %uinsert current uid into filename添加当前 uid 到 core 文件名中
    %ginsert current gid into filename添加当前 gid 到 core 文件名中
    %sinsert signal that caused the coredump into the filename添加导致产生 core 的信号到 core 文件名中
    %tinsert UNIX time that the coredump occurred into filename添加 core 文件生成时间(UNIX)到 core 文件名中
    %hinsert hostname where the coredump happened into filename添加主机名到 core 文件名中
    %einsert coredumping executable name into filename添加程序名到 core 文件名中

    假设现在的程序叫 test,我们设置该程序崩溃时的 core 文件名如下:

    echo "/root/testcore/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
    

    那么最终会在 /root/testcore/ 目录下生成的 test 的 core 文件名格式如下:

    -rw-------. 1 root root 409600 Jan 14 13:54 core-test-13154-1547445291
    

    需要注意的是,您使用的用户必须对指定 core 文件目录具有写权限,否则生成时 会因为权限不足而导致无法生成 core 文件。

    2.4 小结

    本节课介绍了使用 GDB 调试程序的三种方式,理解并熟练使用这三种方式可以帮助读者在遇到问题时准确地选择调试方法。

    展开全文
  • gdb调试 rk可运行程序

    2021-07-07 13:22:17
    gdb rk可运行程序
  • 启动GDB调试 gdb 退出GDB调试 quit #或者 exit #或者 Ctrl-d 注:部分centos版本可能不支持exit 如何启动GDB

    简述

    启动GDB调试

    gdb
    

    在这里插入图片描述

    退出GDB调试

    quit
    #或者
    exit
    #或者
    Ctrl-d
    

    注:部分centos版本可能不支持exit
    在这里插入图片描述

    启动GDB:如何启动GDB

     通过运行程序 gdb 调用 GDB。一旦启动,GDB 会从终端读取命令,直到您告诉它退出。
    您还可以使用各种参数和选项运行 gdb,以在一开始就指定更多的调试环境。
    此处描述的命令行选项旨在涵盖各种情况;在某些环境中,其中一些选项可能实际上不可用。
    启动 GDB 最常用的方法是使用一个参数,指定一个可执行程序:

    gdb program
    

    在这里插入图片描述

    当程序崩溃时,会产生core文件,所以还可以从指定的可执行程序和核心文件开始:

    gdb program core
    

    如:

    gdb inphase.GBServer.out core.89101
    

    相反,如果要调试正在运行的进程,您可以指定进程 ID 作为第二个参数或使用选项 -p:

    gdb program 1234
    #or
    gdb -p 1234
    

    在这里插入图片描述
    在这里插入图片描述

    会将 GDB 附加到进程 1234。使用选项 -p 您可以省略程序文件名。
    利用第二个命令行参数需要一个相当完整的操作系统;当您将 GDB 用作连接到裸板的远程调试器时,可能没有任何“进程”的概念,并且通常无法获得核心转储。如果 GDB 无法附加或读取核心转储,它会警告您。
    您可以选择让 gdb 使用 --args 将可执行文件之后的任何参数传递给下级。此选项停止选项处理。

    gdb --args program  -O2 -c foo.c
    

    在这里插入图片描述
    这将导致 gdb 调试 program ,并将 program 的命令行参数(参见参数)设置为“-O2 -c foo.c”。
    您可以通过指定 --silent(或 -q/–quiet)来运行 gdb,使他不打印前缀资料:

    gdb --silent
    

    看看区别:
    在这里插入图片描述
    您可以使用命令行选项进一步控制 GDB 的启动方式。 GDB 本身可以提醒您可用的选项。
    类型

    gdb -help
    

    在这里插入图片描述
    显示所有可用选项并简要描述它们的使用(可以简写为‘gdb -h’)。
    您提供的所有选项和命令行参数都按顺序处理。使用“-x”选项时,顺序会有所不同。

    退出GDB:如何退出GDB

    quit [expression]
    #or
    exit [expression]
    #or
    q
    

    要退出GDB,请使用quit命令(缩写为 q)、exit命令或键入文件结尾字符(通常为Ctrl-d)。如果不提供表达式, GDB将正常终止;否则它将使用表达式的结果作为错误代码终止。

    中断(通常Ctrl-c)不会从​​ GDB退出,而是终止任何正在进行的GDB命令的操作并返回到GDB命令级别。任何时候键入中断字符都是安全的,因为GDB不允许它在安全的时候生效。

    如果您一直在使用GDB来控制附加的进程或设备,则可以使用detach命令释放它(请参阅调试已运行的进程)。

    shell命令行:如何在GDB中使用 shell 命令

    如果您需要在调试会话期间执行偶尔的 shell 命令,则无需离开或暂停 GDB;你可以只使用shell命令。

    shell command-string
    #or
    !command-string
    

    在这里插入图片描述

    调用标准 shell 来执行命令字符串。注意 ! 之间不需要空格。和命令字符串。在 GNU 和 Unix 系统上,环境变量 SHELL(如果存在)决定运行哪个 shell。否则 GDB 使用默认 shell(GNU 和 Unix 系统上的 /bin/sh,MS-Windows 上的 cmd.exe,MS-DOS 上的 COMMAND.COM 等)。

    开发环境中经常需要使用make。您不必在 GDB 中为此目的使用 shell 命令:

    make make-args
    

    使用指定的参数执行 make 程序。这相当于“shell make make-args”。

    pipe [command] | shell_command
    | [command] | shell_command
    pipe -d delim command delim shell_command
    | -d delim command delim shell_command
    

    执行命令并将其输出发送到 shell_command。请注意,| 周围不需要空格。如果没有提供命令,则重复执行的最后一个命令。
    如果命令包含 |,选项 -d delim 可用于指定将命令与 shell_command 分开的备用分隔符字符串 delim。
    例子:

    (gdb) p var
    $1 = {
      black = 144,
      red = 233,
      green = 377,
      blue = 610,
      white = 987
    }
    (gdb) pipe p var|wc
          7      19      80
    (gdb) |p var|wc -l
    7
    (gdb) p /x var
    $4 = {
      black = 0x90,
      red = 0xe9,
      green = 0x179,
      blue = 0x262,
      white = 0x3db
    }
    (gdb) ||grep red
      red => 0xe9,
    (gdb) | -d ! echo this contains a | char\n ! sed -e 's/|/PIPE/'
    this contains a PIPE char
    (gdb) | -d xxx echo this contains a | char!\n xxx sed -e 's/|/PIPE/'
    this contains a PIPE char!
    (gdb)
    

    日志输出

    将GDB命令的输出保存到文件中。有几个命令可以控制GDB的日志记录。

    set logging enabled [on|off]
    

    启用或禁用日志记录。

    set logging file file
    

    更改当前日志文件的名称。默认日志文件是gdb.txt.

    set logging overwrite [on|off]
    

    默认情况下,GDB将追加到日志文件。overwrite如果要set logging enabled on改写日志文件, 请设置。

    set logging redirect [on|off]
    

    默认情况下,GDB输出将同时发送到终端和日志文件。redirect如果您希望输出仅发送到日志文件,请 设置。

    set logging debugredirect [on|off]
    

    默认情况下,GDB调试输出将同时发送到终端和日志文件。debugredirect如果您希望调试输出仅转到日志文件,请 设置。

    show logging
    

    显示日志记录设置的当前值。
    您还可以将GDB命令的输出重定向到 shell 命令。

    展开全文
  • [root@redhat home]#gdb 调试文件:启动gdb (gdb) l :(字母l)从第一行开始列出源码 (gdb) break n :在第n行处设置断点 (gdb) break func:在函数func()的入口处设置断点 (gdb) info break: 查看断点信息 (gdb) ...
  • GDB调试器及调试方法

    2020-10-29 22:24:49
    GDB调试器及调试方法一、GDB简介二、gdb的使用1、启动gdb2、gdb命令3、gdb调试举例4、内存出错的gdb调试 一、GDB简介 • GDB : GNU Debugger,是GNU工程为GNU操作系统开发的 调试器,但它的使用不局限于GNU操作系统...

    一、GDB简介

    • GDB : GNU Debugger,是GNU工程为GNU操作系统开发的
    调试器,但它的使用不局限于GNU操作系统, GDB可以运行
    在UNIX、Linux甚至Microsoft Windows。
    • GDB可以调试C、C++、Objective-C、Pascal、Ada等语言编
    写的程序;被调试的程序可以跟GDB运行于同一台电脑,也可
    运行于不同电脑。
    • 使用GDB我们可以:
    – 设置断点使程序停住
    – 监视或修改程序中变量的值
    – 跟踪代码执行过程
    gdb的使用
    • 程序要能被调试,必须包含调试信息

    二、gdb的使用

    • 程序要能被调试,必须包含调试信息
    • 编译程序时,通过gcc的-g选项为程序添加调试信息,例如:
    gcc –g –o helloworld helloworld.c

    1、启动gdb

    • gdb [程序名]
    在这里插入图片描述

    2、gdb命令

    • file 装入想要调试的可执行文件。
    • kill 终止正在调试的程序。
    • list 列出产生执行文件的源代码的一部分。
    • next 执行一行源代码但不进入函数内部。
    • step 执行一行源代码而且进入函数内部。
    • run 执行当前被调试的程序。
    • c 继续运行程序。
    • quit 终止gdb。
    • watch 使你能监视一个变量的值而不管它何时被改变。
    • backtrace 栈跟踪,查出代码被谁调用。
    • print 查看变量的值。
    • make 使你能不退出gdb就可以重新产生可执行文件。
    • shell 使你能不离开gdb就执行UNIX shell命令。
    • whatis 显示变量或函数类型。
    • break 在代码里设断点,这将使程序执行到这里时被挂起。
    • info break 显示当前断点清单,包括到达断点处的次数等。
    • info files 显示被调试文件的详细信息。
    • info func 显示所有的函数名称。
    • info local 显示当函数中的局部变量信息。
    • info prog 显示被调试程序的执行状态。
    • delete [n] 删除第n个断点。
    • disable[n] 关闭第n个断点。
    • enable[n] 开启第n个断点。
    • ptype 显示结构定义。
    • set variable 设置变量的值。
    • call name(args) 调用并执行名为name,参数为args的函数。
    • Finish 终止当前函数并输出返回值。
    • return value 停止当前函数并返回value给调用者。
    • break命令的使用
    – 根据行号设置断点:
    • (gdb) break linenum
    – 根据函数名设置断点:
    • (gdb) break funcname
    – 执行非当前源文件的某行或某函数时停止执行:
    • (gdb) break filename:linenum
    • (gdb) break filename:funcname
    – 根据条件停止程序执行:
    • (gdb) break linenum if expr
    • (gdb) break funcname if expr
    

    3、gdb调试举例

    • 下面的代码实现对一个整型数的反转功能,比如输入123,则
    输出321。
    • 但输入100时,程序的输出结果却不
    在这里插入图片描述
    1.c

    #include <stdio.h>
    void ShowRevertNum(int iNum)
    {
    	while (iNum > 10)
     	{
    		printf("%d", iNum % 10);
     		iNum = iNum / 10;
     	}
     	printf("%d\n", iNum);
    }
    int main(void)
    {
     	int iNum;
     	printf("Please input a number :");
     	scanf("%d", &iNum);
     	printf("After revert : ");
     	ShowRevertNum(iNum);
    }
    

    用l列出代码及行号:
    在这里插入图片描述

    4、内存出错的gdb调试

    Linux中,程序崩溃时,一般会产生core文件,记录进程退出前
    的状态,调试段错误问题,借助于该文件,可快速定位问题。
    • 可按如下步骤生成和使用core文件
    – Step 1: 让系统产生core文件
    • ulimit –c num #设定core文件容量(num为数字,为0
    是不产生core文件)
    – Step 2: 运行程序,让程序崩溃,从而生成core文件
    – Step 3: gdb配合core文件,定位问题
    • gdb 程序名 core文件名
    • 比如: gdb segDemo core

    • 练习:利用core文件定位以下出错代码。

    #include<stdio.h>
    int main()
    {
    	int *p=0;
    	*p=1;
    	return 0;
    }
    

    在这里插入图片描述
    使用gdb配合core文件定位问题
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • GDB使用和调试手册.pdf

    2020-06-26 10:37:14
    本文档为GDB使用和调试手册,可以根据本文档快速掌握GDB调试技巧,简单、易懂、全面!可以关注本人博客GDB调试篇快速掌握GDB技巧!
  • GDB(GNU symbolic debugger)简单地说就是一个调试工具。它是一个受通用公共许可证即GPL保护的自由软件。 像所有的调试器一样,GDB可以让你调试一个程序,包括让程序在你希望的地方停下,此时你可以查看变量、...
  • GDB调试详细命令

    2018-06-01 16:23:05
    GDB详细手册,文档内部分内容: //查看运行中的线程 (gdb) info thread //查看线程 (gdb) thread <n> //切换为线程id (gdb) bt //backtrace 打印堆栈 (gdb) break xx.cpp:xx thread all //在所有线程上打断点 (gdb) ...
  • 在安装完 gdb 后,就可以尝试使用 gdb 在终端中调试程序了, 1. 创建或定位到需要调试的 .c 文件 首先编写一个简单的 helloworld.c: #include<stdio.h> int main() { printf("hello world! \n"); return 0; ...
  • Linux下如何使用gdb启动调试

    千次阅读 2020-03-12 20:46:51
    GDB是Linux下非常好用且强大的调试工具。GDB可以调试C、C++、Go、java、 objective-c、PHP等语言。对于一名Linux下工作的c/c++程序员,GDB是必不可少的工具,本篇以C语言来调试GDB简介 UNIX及UNIX-like下的调试...
  • gdb基本调试案例:采内存
  • gdb调试手册

    2018-08-17 17:45:44
    gdb使用手册,详细介绍gdb在linux操作系统下的使用步骤
  • GDB调试应用指南Guide
  • GDB调试方法

    千次阅读 2022-01-18 16:00:23
    文章目录启动GDB调试coredump的设置与调试常用命令列表部分命令详解break/binfo break以及断点的enable、disable和deleteprint/p 和 ptypethread及info threadwatch常用调试技巧使 print 打印显示完整多线程下锁定...
  • gdb是一个在UNIX环境下的命令行调试工具。如果需要使用gdb调试程序,请在gcc时加上-g选项。下面的命令部分是简化版,比如使用l代替list等等
  • 本书介绍了大量的gdb调试技巧,里面的技巧在开发过程中非常的实用,高清带书签版
  • Linux GDB调试文档

    2019-02-13 11:23:02
    使用GDB调试,英文版。对于从事 Linux C/C++ 后台开发的读者来说,GDB 调试是需要熟练掌握的一项技能
  • GDB调试手册.pdf

    2019-06-17 13:39:44
    介绍GDB的使用调试方法,自己积累的经验调试 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等 IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这...
  • Linux下gdb调试用法命令

    万次阅读 多人点赞 2017-02-15 22:32:00
    一直在Fedora平台下写opencv的程序,需要对程序进行调试,主要用的调试工具是gdb. gdb提供了如下功能: 1.在程序中设置断点,Debug时遇到断点处暂停 ...下面结合OpenCV针对C\C++程序使用gdb调试进行介绍。
  • GDB调试指北-启动GDB并查看说明信息

    千次阅读 2020-08-08 00:15:03
    学习 `gdb` 使用是一个漫长的过程,先了解一下 `gdb` 的启动方式和基础信息的查看方法,能够帮助我们更全面的认知这个工具。`gdb` 是一个交互式命令行程序,在使用 `gdb` 调试的时候不断的在命令行内输入命令,然后 ...
  • Linux学习——GDB调试

    千次阅读 2021-10-22 22:55:36
    Linux——GDB调试GDB简介GDB下载和安装GDB调试C/C++的过程GDB run(r)命令:启动程序GDB break(b):设置断点GDB watch命令:监控变量值的变化GDB catch命令:建立捕捉断点GDB条件断点(condition命令)GDB单步...
  • GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。同时GDB也具有例如ddd这样的图形化的调试
  • GDB调试

    千次阅读 2021-03-12 22:16:36
    gdb 是 UNIX 及 UNIX-like 下的调试工具,在 Linux 下一般都直接在命令行中用 gdb调试程序,相比 Windows 上的集成开发环境 IDE 提供的图形界面调试,一开始使用 gdb 调试可能会让你感到生无可恋,但是只要熟悉了...
  • GDB调试打印STL PROTOBUF

    2017-09-14 14:42:19
    GDB调试打印STL PROTOBUF,只要放到.gdbinit文件中就可以直接打印MAP LIST VECTOR SET DEQUEUE等等STL容器里装的东西了。还有PROTOBUF里装的东西也可以打印出来,调试时看PB协议很方便。
  • `gdb` 调试程序,必须让 `gdb` 程序和被调试程序建立联系,这种联系可以通过程序的可执行文件、core文件或者正在运行的进程来建立,具体调试的时候使用的选项不同,涉及到参数的传递,选项的顺序,多进程启动前的...
  • Linux下gdb调试

    千次阅读 2022-02-11 15:29:53
    linux下gdb调试方法 1.启动gdb 编译一个测试程序,-g表示可以调试,命令如下: gcc -g *.c -o a 启动gdb,命令如下: gdb a gdb -q a//表示不打印gdb版本信息,界面较为干净; 2、查看源码 list :简记为 l ,其...
  • Linux启动gdb调试模式

    千次阅读 2014-11-29 11:59:53
    由于使用linux编译程序不多,所以不太清楚如何使用debug模式,再请教主程时,得到了一些方法启用debug模式,发现GDB功能的强大,足矣调试出你的程序崩溃原因。 由于linux环境的差异性,很多情况都千差万

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 96,731
精华内容 38,692
关键字:

如何启动gdb调试