C 语言编程 |
您所在的位置:网站首页 › linux调试工具gdb › C 语言编程 |
目录
文章目录
目录
前文列表
代码调试
GDB
启动 GDB
交互命令
运行程序
暂停程序
设置断点
设置观察点
设置捕捉点
打印信息
查询运行信息
分割窗口
前文列表
《程序编译流程与 GCC 编译器》 《C 语言编程 — 基本语法》 《C 语言编程 — 基本数据类型》 《C 语言编程 — 变量与常量》 《C 语言编程 — 运算符》 《C 语言编程 — 逻辑控制语句》 《C 语言编程 — 函数》 《C 语言编程 — 高级数据类型 — 指针》 《C 语言编程 — 高级数据类型 — 数组》 《C 语言编程 — 高级数据类型 — 字符串》 《C 语言编程 — 高级数据类型 — 枚举》 《C 语言编程 — 高级数据类型 — 结构体与位域》 《C 语言编程 — 高级数据类型 — 共用体》 《C 语言编程 — 高级数据类型 — void 类型》 《C 语言编程 — 数据类型的别名》 《C 语言编程 — 数据类型转换》 《C 语言编程 — 宏定义与预处理器指令》 《C 语言编程 — 异常处理》 《C 语言编程 — 头文件》 《C 语言编程 — 输入/输出与文件操作》 《C 语言编程 — 堆栈与内存管理》 《C 语言编程 — 指令行参数》 代码调试GDB(GNU Debugger)包含在 GNU 的 GCC 开发套件中,是基于命令行的、功能强大的程序调试工具。对于一名 Linux 平台下工作的 C/C++ 程序员,GDB 是必不可少的工具。 安装: yum install gdb -y 1GDB 主要能够帮忙我们完成下面四个方面的功能: 可以按照自定义的要求运行程序。 支持基于条件表达式的断点。 当程序被停住时,可以检查此时程序中所发生的事情。 动态的修改程序的执行环境。程序的调试过程主要有:单步执行,跳入函数,跳出函数,设置断点,设置观察点,查看变量。 简单示例: $gdb programmer # 启动 gdb >break main # 设置断点 >run # 运行调试程序 >next # 单步调试 >print var1 # 打印变量值 >list # 显示当前调试处的源代码 >info b # 显示当前断点设置情况 1 2 3 4 5 6 7 启动 GDB对 C/C++ 程序的调试,需要在编译前就加上 -g 选项。-g 选项的作用是在可执行文件中加入源文件信息,所以在调试时必须保证 gdb 能找到源文件。不使用 -g 的话将看不见程序的函数名和变量名,代替它们的全是运行时的内存地址。 DEBUG 模式编译 $ gcc -g main.c -o main 1 调试执行文件: $ gdb main GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-115.el7 Copyright (C) 2013 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-redhat-linux-gnu". For bug reporting instructions, please see: ... Reading symbols from /root/main...done. (gdb) 1 2 3 4 5 6 7 8 9 10 11 12NOTE:如果没有加 -g 进行编译的话,会出现错误。意思是没能从可执行文件中获得符号表(symbol table)信息,你可以使用 -se file 指令,从指定文件中读取符号表信息,并把它用在可执行文件中。 No symbol table is loaded. Use the "file" command. 1 调试服务程序:GDB 也可以用于调试服务程序,可以指定服务程序运行时的进程 ID。GBD 会自动 Attach 上去,并开启调试。此时,程序的执行文件应该已经被加入到 PATH 环境变量中。 $ gdb 1 交互命令启动了 GDB 后,就进入到指令行的交互模式,可以通过以下指令完成对程序的调试。 速查表: start // 开始调试 n // 一条一条执行 step/s // 执行下一条,如果函数进入函数 backtrace/bt // 查看函数调用栈帧 info/i locals // 查看当前栈帧局部变量 frame/f // 选择栈帧,再查看局部变量 print/p // 打印变量的值 finish // 运行到当前函数返回 set var sum=0 // 修改变量值 list/l 行号或函数名 // 列出源码 display/undisplay sum // 每次停下显示变量的值/取消跟踪 break/b 行号或函数名 // 设置断点 continue/c // 连续运行 info/i breakpoints // 查看已经设置的断点 delete breakpoints 2 // 删除某个断点 disable/enable breakpoints 3 // 禁用/启用某个断点 break 9 if sum != 0 // 满足条件才激活断点 run/r // 重新从程序开头连续执行 watch input[4] // 设置观察点 info/i watchpoints // 查看设置的观察点 x/7b input // 打印存储器内容,b--每个字节一组,7--7组 disassemble // 反汇编当前函数或指定函数 si // 一条指令一条指令调试 而 s 是一行一行代码 info registers // 显示所有寄存器的当前值 x/20 $esp // 查看内存中开始的20个数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 运行程序 run [arglist](r)运行程序:当遇到断点后,程序会在断点处停止运行,等待用户输入下一步的命令。如果指定了 arglist,则作为参数运行程序。 set var 变量名=变量值:设置运行时参数。 continue(c)继续执行:到下一个断点处(或运行结束)。 next(n)单步执行:当遇到函数调用时,不会进入函数体。 step(s)单步执行:当遇到函数调用时,则进入函数。与 next 的主要区别是,step 遇到自定义函数后,会步进到函数中运行,而 next 则直接调用函数,不会进入到函数体内。 until:当你厌倦了在一个循环体内单步执行时,这个命令可以运行程序直到退出循环体。 until n:运行至 n 行,不仅仅用来跳出循环。 return:强制从当前函数返回。 finish:运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息。 call 函数(参数):调用有效函数,并传入实参,如:call gdb_test(55)。 Ctrl-C:在当前位置停止执行正在执行的程序,断点在当前行。 quit(q):退出 GDB 调试终端。 shell:使你能不离开 gdb 就执行 UNIX shell 命令。 暂停程序在 GDB 中,程序有以下几种暂停方式: 断点(BreakPoint) 观察点(WatchPoint) 捕捉点(CatchPoint) 信号(Signals) 线程停止(Thread Stops)当已定义好的停止点没有用时,可以使用 delete、clear、disable、enable 这几个命令来进行维护。此外还有 ignore,可以指定程序运行时,忽略停止条件几次。 设置断点 break linenum(b n):在第 n 行处设置断点。 break [file:]function、break [file:]linenum:在指定源文件的指定函数或行号设置断点,e.g. b OAGUPDATE.cpp:578。 b fn1 if a>b:设置条件断点。 txbreak:在当前函数的退出的点上设置一个临时的断点,只可使用一次。 info b :显示当前程序的断点设置情况。 delete n:删除第 n 个断点。 enable n:开启第 n 个断点。 clear n:清除第 n 行的断点。 delete breakpoints:清除所有断点。 设置观察点观察点通常用来观察某个表达式的值是否变化了。如果有变化,马上停住程序。 watch:设置一个监视点,一旦被监视的表达式的数值改变了,停住程序。 rwatch:当表达式被读时,停住程序。 awatch:当表达式的值被读或被写时,停住程序。 info watchpoints:列出当前设置的所有观察点。 设置捕捉点设置捕捉点来补捉程序运行时的一些事件,e.g. 载入共享库(动态链接库)或是 C++ 的异常。 catch:当时间发生时,停住程序。 tcatch:只生效一次的捕捉点。Event 列表: 文章来源: is-cloud.blog.csdn.net,作者:范桂飓,版权归原作者所有,如需转载,请联系作者。 原文链接:is-cloud.blog.csdn.net/article/details/105320002 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |