gdb基础命令和常用操作补充

GDB是Unix下的一个程序调试工具,类似于windows下面的VC调试器,区别在于GDB采用全命令行控制。

使用GDB需要在编译时使用-g选项,gcc支持-g –O选项同时使用,但如果还在调试阶段,尽量不要-O2,也不要删除(strip)符号表。作用如下:

让程序按照自己定义的要求运行,不必每次改变程序

让程序在设置的断点处停住,并且检查程序的执行情况

动态改变程序的执行环境

一、启动调试

gdb <program> 启动程序进行调试

gdb ./bin/chat_server

gdb --args ./bin/chat_server -c conf/cache_server.conf

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

gdb attach <pid> 调试一个已经运行服务程序

gdb ./bin/chat_server $(pgrep  chat_server)

gdb <program> core 调试程序core down时候产生的core文件

gdb ./bin/chat_server core

Attach到后台进程,将操作预先输入好,避免影响程序正常运行

sudo gdb ./bin/chat_server `pgrep chat_server` <<END

b HandleAccept

c

p (char *)inet_ntoa(pstSctx->stClientAddr.sin_addr)

p ntohs(pstSctx->stClientAddr.sin_port)

quit

END

二、gdb基础命令

三、gdb常用操作补充

1. ulimit -c unlimited; 调试core文件

bt/where/info s 显示函数调用堆栈

up n 向调用链根部移动n个函数

down n 向调用链叶部移动n个函数

f n 选择函数调用链上编号为n的函数,0表示当前函数

info files 显示core文件里面的segment映射

如果core文件函数调用栈乱掉,可以参照 http://devpit.org/wiki/x86ManualBacktrace 恢复堆栈。

2. 设置观察点

watch     <expr>  expr 值变化时,停止程序

rwatch    <expr>  expr 值被读时,停止程序

awatch    <expr>  expr 值被读或被写时,停止程序

info watchpoints  查看当前观察点信息

3.反汇编

set disassembly-flavor intel # 设置反汇编格式

disassemble可以反汇编当前函数或者指定的函数,单独用disassemble命令是反汇编当前函数,如果disassemble命令后面跟函数名或地址则反汇编指定的函数。

4.前面讲过step命令可以一行代码一行代码地单步调试,而这里用到的si/ni命令可以一条指令一条指令地单步调试。

info registers可以显示所有寄存器的当前值。在gdb中表示寄存器名时前面要加个$,例如p $esp可以打印esp寄存器的值,如esp寄存器的值是0xbff1c3f4,所以x/20 $esp命令查看内存中从0xbff1c3f4地址开始的20个32位数。

5. p 命令内存输出格式:

? d: ?十进制

? u: ?十进制?无符号

? x: ?十六进制

? o: ?八进制

? t: ?二进制

? c:   字符

如 p/x var

6. set listsize 50 修改源代码显示行数; 此外还有set args 设置参数;set var 设置变量值

7.设置位置断点,设置断点命令b (break的简写)

b linenum

b function

b filename:linenum

b filename:function

b *address

b if <condition>

8. 查看当前运行信息

info b <breakpoints>  breakpoints 为设置的断点的标号

info args/frame/locals/line  filename:function

info line 配合disassemble使用可查看程序汇编代码

其中info frame 显示的当前堆栈信息比frame详细,可以先用frame num 切换堆栈,where/info s/bt 可以查看堆栈调用链

9. 条件式中断 b test if a == 10  类似 condition 4 a == 30 (4 是bk num)

10. 删除断点可以使用 clear和d(delete的简写)

clear删除断点, 使用方法和b命令类似

d  [breakpoints]    breakpoints 为设置的断点的标号

10. 启动和查看程序

setargs 设置程序运行参数

run运行程序,使用方式如:r   <args>

List  显示程序源代码命令,使用show listsize 查看显示代码的行数

list <function/linenum/filename:function/filename:linenum/-/+> ,-向上翻动,+向下翻动

p var/expression(filename::var/function::var),打印变量值

11. 恢复运行程序和单步调试程序

continue,继续运行程序

next  <count> 单步跟踪,遇到函数不进入函数

step  <count> 单步跟踪,遇到函数会进入该函数

finish 直到函数运行完成,打印函数信息

until   在循环体内跟踪程序,直到整个循环结束

12. x 命令可以显示指定地址的内存数据。

格式: x/nfu [address]

? n: 显示内存单位 (组或者行)。

? f: 格式 (除了print 格式外,还有字符串s 和 汇编i)。

? u: 内存单位 (b: 1字节; h: 2字节; w: 4字节; g: 8字节)。

x/8w 0x0804843b # 按四字节(w)显示 8组内存数据

x/8i 0x0804843b # 显示8 行汇编指令

13. 进程与线程

info proc mappings # 相当于 cat /proc/{pid}/maps 查看maps内存数据

可以在 pthread_create 处设置断点,当线程创建时会生成提示信息。[New Thread 0xb7e78b70 (LWP 2933)]

info threads # 查看所有线程列表

where # 显示当前线程调用堆栈

thread num # 切换线程 [Switching to thread 1 (Thread 0xb7e796c0 (LWP 2932))]#0 0xb7fe2430 in __kernel_vsyscall ()

14. 其他零散

调试子进程。

(gdb) set follow-fork-mode child

临时进入Shell执行命令,Exit返回。

(gdb) shell

调试时直接调用函数。

(gdb) call test("abc")

使用 "--tui" 参数,可以在终端窗口上部显示一个源代码查看窗。

$ gdb --tui hello

查看命令帮助。

(gdb) help b

最后就是退出命令。

(gdb) q

和Linux Base Shell习惯一样,对于记不住的命令,可以在输入前几个字母后按Tab补全。

经验:如果某个函数的局部变量发生访问越界,有可能并不立即产生段错误,而是在函数返回时产生段错误。

参考:

《linux c 编程一站式学习》

《C 学习笔记》 by雨痕

时间: 2024-10-14 04:48:05

gdb基础命令和常用操作补充的相关文章

Mysql命令行常用操作

Mysql命令行常用操作 一.从命令行登录MySQL数据库服务器 1.登录使用默认3306端口的MySQL /usr/local/mysql/bin/mysql -u root -p 2.通过TCP连接管理不同端口的多个MySQL(注意:MySQL4.1以上版本才有此项功能) /usr/local/mysql/bin/mysql -u root -p --protocol=tcp --host=localhost --port=3307 3.通过socket套接字管理不同端口的多个MySQL /

makefile基础和工作常用点补充

一.Makefile简介 Makefile是什么,能做什么用,为什么要用? 定义编译规则.自动化编译.提高效率 组织文件 Makefile由一组规则(Rule)组成,每条规则的格式是: 例如: 依赖关系如下图: 注意: (1) 当我们为了执行命令而非创建目标文件时,就会使用伪目标比如 clean,伪目标总是被执行.".PHONY" 的作用是避免和当前 目录下的文件名冲突 (可能引发隐式规则). (2) 使用 "-" 前缀可以忽略命令错误,比如创建已有的路径: &qu

【Linux】常见基础命令之系统操作

linux现在基本上已成为面试的必考题目,特此总结一些常用的基础命令. cd:切换目录 lilip@ubuntu:~$ cd /home/lilip/test pwd:打印当前目录 lilip@ubuntu:~/test/page/inception$ pwd ls:显示当前目录或指定目录下的文件和目录 lilip@ubuntu:~/test$ ls ll:以列表的形式显示目录下所有的文件和目录 lilip@ubuntu:~/test$ ll mkdir:创建新目录 lilip@ubuntu:~

python基础之列表常用操作及知识点小结

列表(list) List(列表) 是 Python 中使用最频繁的数据类型.列表可以完成大多数集合类的数据结构实现.它支持字符,数字,字符串甚至可以包含列表(所谓嵌套).列表用[ ]标识,是python最通用的复合数据类型. 常用操作 L=[1,2,3,'xyn',5] 代码 含义 输出 L.append(‘a’) 在L列表后追加元素 [1,2,3,’xyn’,5,1,’a’] L.insert(0,’a’) 在L[0]的位置插入’a’ [‘a’,1,2,3,’xyn’,5,1] L.pop(

java基础之数组常用操作

常用的对数组进行的操作 1.求数组中最大值,最小值 思路:假设下标为0的元素是最大值,遍历数组,依次跟max进行比较,如果有元素比这个max还大,则把这个值赋给max.最小值同样 1 public class TestArray{ 2 public static void main(String[] args){ 3 int[] arr={23,45,234,576,34,87,34,12,67}; 4 int max=arr[0]; 5 int min=arr[0]; 6 for(int i=

Linux常用命令与常用操作

常用命令 普通命令 file 查看文件类型 pwd 打印当前目录 ping 发数据包 touch 创建文件 history 查看历史命令 clear/cls 清理终端显示 echo * 使用echo打印目录所有文件和文件夹 uname-r 查看Linux内核版本 which [file] 看文件的绝对路径 rebot 重启 halt 关机 poweroff 关机 echo $RANDOM 打印一个随机数($RANDOM是一个随机数) env 查看环境变量 $PATH 执行命令的环境变量 ln -

05.virsh命令的常用操作(kvm)

注:以下命令均可在virsh的man手册页中找到   KVM虚拟机管理常用命令(domain): virsh命令参数 功能 用法举例 list 查看已经存在的domain信息(可以带参数) virsh list --all (查看所有的虚拟机) start 开始一个不活跃的domain(前提是存在) virsh start test2 autostart 配置domain随boot启动 virsh autostart test2 shutdown 优雅的关闭domain virsh shutdo

Linux基础命令---IP路由操作

ip ip指令可以显示或操作路由.网路设备,设置路由策略和通道. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora.   1.语法      ip [选项]  OBJECT  COMMAND [help] OBJECT对象可以是:link,网络设备:addr,设备的协议地址:route,路由表:rule,策略:neigh,arp缓存:tunnel,ip通道:maddr,多播地址:mroute,多播路由 COMMAND是操作命令,不同的

centos命令行常用操作

1.查看某个端口占用 lsof -i tcp:80 2.查看是否安装了防火墙 service iptables status 查看是否启用防火墙/etc/init.d/iptables status 3.查看全部安装的文件包yum list installed 4.查看有多少个php-fpm执行ps -fe |grep "php-fpm"|grep "pool"|wc -l 5.centos内存占用过高 sync echo 3 > /proc/sys/vm/d