zoukankan      html  css  js  c++  java
  • GDB代码调试与使用

    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 运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值信息。
  • 相关阅读:
    javascript正则表达式对象、窗体对象11.0
    springboot~不用模板执行html文件
    springboot-jar-web
    springboot-war
    springboot-jar
    idea~创建maven webapp项目
    简单日志项目
    loback.xml 在idea中代码自动完成
    mysql 时区问题导致的时间相差14小时
    mariadb vs mysql
  • 原文地址:https://www.cnblogs.com/sjy519/p/6131347.html
Copyright © 2011-2022 走看看