GDB代码调试与使用

Linux下GDB调试代码

源代码

编译生成执行文件

gcc -g test.c -o test

使用GDB调试

  • 启动GDB:gdb test

  • 从第一行列出源代码:list

  • 直接回车表示,重复上一次命令

  • 设置断点,在源程序16行处:break 16

  • 设置断点,在函数func()入口处:break func

  • 查看断点信息:info break

  • 运行程序:run

  • 在断点处停住
  • 单条语句执行:next

  • 继续运行程序:continue【程序输出:result[1-100]=5050】

  • 打印变量i的值:print i

  • 打印变量sum的值:p sum

  • 查看函数堆栈:bt

  • 推出函数:finish

  • 继续运行程序:continue【程序输出:result[1-250]=31125;程序退出,调试结束:Inferior 1 (process 4040) exited normally】

  • 退出GDB:quit

使用GDB

启动GDB

  • gdb [program] program也就是你的执行文件,一般在当前目录下。

  • gdb [program] core 用gdb同时调试一个运行程序core文件,core是程序非法执行后core dump后产生的文件。

  • gdb [program] [PID] 如果你的程序是一个服务程序,那么你可以指定这个服务程序运行是的进程ID。gdb会自动attach上去,并调试它。program应该在PATH环境变量中搜索到。

GDB的命令概貌

  • 启动GDB后,就进入了GDB的调试环境,就可以使用GDB的命令开始调试程序了,GDB的命令可以使用help命令来查看:

  • GDB的命令很多,GDB把之分成很多种类。help命令只是列出了GDB的命令种类,如果要看种类中的命令,使用help [class]命令,如:help breakpoints,查看设置断点的所有命令。也可以直接help [command]来查看命令的帮助。

  • GDB中,输入命令时,可以不用打全命令,只用打命令的前几个字符就可以了,当然,命令的前几个字符要标志着一个唯一的命令,在linux下,可以敲击两次TAB键来补齐命令的全称,如果有重复的,GDB会把其列出来。

    • 示例一:在进入函数func时,设置一个断点。可以敲击break func,或者直接就是b func
    • 示例二:敲入b按两次TAB键,你会看到所有b开头的命令:
    • 示例三:只记得函数的前缀,可以这样:(gdb)b make_<按TAB键>,GDB把所有make开头的函数全部列出来给你查看。

退出GDB

  • 使用quit命令或者q命令。

在GDB中运行程序

  • 当以gdb [program]方式启动GDB后,GDB会在PATH路径和当前目录中所搜[program]的源文件。如要确认GDB是否读到源文件,可使用l或者list命令,看GDB是否能列出源代码。

  • 在gdb中,运行程序使用r或者run命令。

调试已运行的程序

  • 在UNIX下用ps查看正在运行的程序的PID(进程ID),然后用gdb [program] PID格式挂接正在运行的程序。

  • 先用gdb [program]关联上源代码,并进行GDB,在GDB中用attach命令来挂接进程的PID,并用detach来取消挂接的程序。

暂停程序运行

  • 调试程序中,暂停进程运行时必须的,GDB可以方便的暂停程序的运行。你可以设置程序在哪停住,在什么条件下停住,在收到什么信号时停住等等。你便于你查看运行的变量,以及运行时的流程。

  • 当进程被GDB停住时,你可以使用infoprogram来查看程序是否在运行、进程号、被暂停的原因。

  • 在GDB中,我们可以有以下几种暂停方式:断点(breakpoint)、观察点(watchpoint)、捕捉点(catchpoint)、信号(signals)、线程停止(threadstops)。如果要恢复程序运行,可以使用c或者continue命令。

    设置断点(breakpoint)
    我们用break命令设置断点。下面有几点设置断点的方法:
    break [function] 在进入指定函数时停住;
    break [linenum] 在指定行号停住;
    breakfilename:linenum 在源文件filename的linenum行处停住;
    breakfilename:function 在源文件filename的function函数的入口处停住;
    break break命令没有参数时,表示在下一条指令处停住;
    break…if<condition> …可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环体中,可
    以设置break if i=100,表示当i为100时停住程序。
  • 查看断点时,可使用命令info命令,如下所示:(注:n表示断点号)

    • info breakpoints [n]
    • info break [n]

恢复程序运行

  • 当程序被停住后,可以用continue命令恢复程序的运行直到程序结束,或下一个断点的到来。也可以使用step或next命令单步跟踪程序。

    • continue [ignore-count]
    • c [ignore-count]
    • fg [ignore-count] 恢复程序运行,直到程序结束,或是下一个断点到来。Ignore-count表示忽略其后的断点次数。continue,c,fg三个命令都是一样的意思。
    • step [count] 单步跟踪,如果有函数调用,它会进入该函数。
    • next [count] 同样单步跟踪,如果有函数调用,它不会进入函数。
    • finish 运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值信息。

GDB代码调试与使用的更多相关文章

  1. LINUX上使用GDB单步调试Chromium Android C++代码。

    ###动机###在LINUX使用GDB单步调试Chromium Android C++代码. [1]编译android平台Chromium, 修改GN文件中编译选项:-g -O0 使得编译优化更少,便 ...

  2. gdb可以调试python的pdb么

    1.如题: gdb可以调试python的pdb么? 答案:可以,实验如下. 2.实验: 生成一个a.py代码文件,代码如下: import pdb a = 1 print "111" ...

  3. GDB+GDBServer调试Linux应用程序

    参考:http://blog.csdn.net/shanghaiqianlun/article/details/7820401 一.gdb+gdbserver总体介绍 远程调试环境由宿主机GDB和目标 ...

  4. GDB 多进程调试

    启动: $gdb <file>  || $gdb 然后(gdb)file <file> 运行: (gdb)run <该程序本身的命令行参数> 查看代码: (gdb) ...

  5. DM368 arm板GDB远程调试

    参考: http://www.erchashu.com/wiki/eclipse-cdt-gdb-arm-app-cross-debug 远程调试环境由宿主机GDB和目标机调试stub共同构成,两者通 ...

  6. gdb 远程调试android进程 -转

    什么是gdb 它是gnu组织开发的一个强大的unix程序调试工具,我们可以用它来调试Android上的C.C++代码. 它主要可以做4件事情: 随心所欲地启动你的程序. 设置断点,程序执行到断点处会停 ...

  7. Gdb远程调试Linux内核遇到的Bug

    知识共享许可协议本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/gdb-bug 本博客同步在http://www.cn ...

  8. gdb命令调试技巧

    gdb命令调试技巧 一.信息显示1.显示gdb版本 (gdb) show version2.显示gdb版权 (gdb) show version or show warranty3.启动时不显示提示信 ...

  9. 第一部分牛刀小试:启动GDB开始调试

    当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的.当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入“栈”(Stack)中.你可以用GDB命令来查看当前的栈中的信息 ...

随机推荐

  1. Effective Java 11 Override clone judiciously

    Principles If you override the clone method in a nonfinal class, you should return an object obtaine ...

  2. Apache Kafka - Quick Start on Windows

    在这篇文章中,我将要介绍如何搭建和使用Apache Kafka在windows环境.在开始之前,简要介绍一下Kafka,然后再进行实践. Apache Kafka Kafka是分布式的发布-订阅消息的 ...

  3. 烂泥:kickstart无人值守安装CentOS6.5

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 在本次实验进行之前,首先我们要把公司的网络环境进行介绍. 注意这个网络拓扑图,也是生产环境的一个实例.同时服务器192.168.1.214已关闭ipta ...

  4. CentOS6.5上golang环境配置

    CentOS6.5上golang环境配置 一.下载和解压go环境包 >>cd /usr/local/src/ >>wget -c http://golangtc.com/sta ...

  5. 解决android的ListView嵌套在ScrollView中不能被滚动的问题

    使用滚动条容易带来一个后果,就是高度和宽度不受控制了, 之前就遇到一个已经有ScrollView的页面需要加个列表listView,然后就发现listView只看到前两行数据,下面的看不到,拉滚动条也 ...

  6. 21 数据库编程 - 《Python 核心编程》

  7. UEditor For ASP.Net Core Use Qiniu

    UEditor For ASP.Net Core Use Qiniu 此项目为UEditor提供文件管理; 后端服务使用 ASP.Net Core; 使用七牛提供的云存储; 项目地址 https:// ...

  8. UVA-10828 (概率期望+高斯消元)

    题意: 给个有向图,每个节点等概率转移到它的后继节点,现在问一些节点的期望访问次数; 思路: 对于一个点v,Ev=Ea/d[a]+Eb/d[b]+Ec/d[c];a,b,c是v的前驱节点; 然后按这个 ...

  9. POJ 2464 Brownie Points II --树状数组

    题意: 有点迷.有一些点,Stan先选择某个点,经过这个点画一条竖线,Ollie选择一个经过这条直接的点画一条横线.Stan选这两条直线分成的左下和右上部分的点,Ollie选左上和右下部分的点.Sta ...

  10. 使用jQuery向asp.net Mvc传递复杂json数据-ModelBinder篇

    调用jQuery的ajax方法时,jQuery会根据post或者get协议对参数data进行序列化; 如果提交的数据使用复杂的json数据,例如: {userId:32323,userName:{fi ...