GDB使用详解

一、打开GDB

1、gdb filename

加载该文件到gdb

2、gdb

file filename

如果gdb filename失败,可以在打开gdb以后,通过file来加载调试文件

3、gdb -tui

file filename

带画面的调试

如果显示上图的信息说明,没有指定文件,或者没有调试信息。

*注意-g,在linux下用gcc编译时,如果不加-g,编译器会进行优化,就不会生成调试信息,无法调试,也可以使用-ggdb,这是gcc为gdb提供的更详细的调试信息,别的调试器无法使用。

二、常见命令

l(list):显示代码,list 行号:将显示当前文件以“行号”为中心的前后10行代码,如:list 12,list 函数名:将显示“函数名”所在函数的源代码,如:list main;

b(break):设置断点,参数可以是行数,函数名,也可以用文件名:行数或者文件名:函数名;

tb(tbreak):临时断点,参数和b的一样;

info b(i b/info break):查看断点,查看断点;

:如下图,通过b设置断点,如果要为断点指定源文件,使用b helloworld.c:10(源文件名:行数或者函数名),列Num的数字123是断点序号,Disp为keep的表示为普通断点,为del的则为临时断点,Enb是断点是否有效,y为有效,无效为n

clear n:清除第n行的断点; d (delete) n:删除第n个断点; disable n:暂停第n个断点; enable n:开启第n个断点;

:下图是删除断点和暂停开始和清楚的示例

r (run):执行程序;

s(step):有函数时,进入函数函数体,没有时,单步执行;

n (next):单步执行,不进入函数体;

c (continue):遇到断点以后,程序会阻塞,输入c可以让程序继续执行;

p (print):打印表达式,表达式可以是变量,也可以是操作,也可以是函数调用 print 1,print a+1 print f(a);

until:可以运行程序直到退出循环体;

finish:运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息;

watch:设置一个监视点,一旦被监视的“表达式”的值改变,gdb将强行终止正在被调试的程序;

frame n:移动到指定的栈帧,并打印栈的信息,n为帧编号,如果不指定n,打印当前栈的信息;

set args 参数:指定运行时的参数;

show args:查看设置好的参数;

show paths:查看程序运行路径;set environment varname [=value] 设置环境变量。show environment [varname] 查看环境变量; cd 相当于shell的cd;

pwd :显示当前所在目录;

info program: 来查看程序的是否在运行,进程号,被暂停的原因;

bt(backtrace):查看堆栈信息,因为栈是后进先出,所以要从下往上看,最下面的是最先执行的函数;

threads:查看所有线程信息;

shell XXX:执行shell命令行,XXX为shell命令,如shell ls就执行shell里的ls命令;

thread n:切换线程,参数为线程号,可以通过threads查看,一般常用的是通过threads查看线程序号,通过thread n切换过去,再用bt查看线程栈的信息;

condition:给断点设置触发条件,比如b 10 if a > b与b 10然后condition 1 if a> b等价(假设b 10的断点号为1),取消断点条件用condition 断点号;

ignore:特殊断点条件,程序只有到达该断点指定次数以后才会触发,ignore 1 10,忽略断点号为1的断点10次以后才触发;

kill:将强行终止当前正在调试的程序;

help 命令:help 命令将显示“命令”的常用帮助信息;

call 函数(参数):调用“函数”,并传递“参数”,如:call gdb_test(55);

layout:用于分割窗口,可以一边查看代码,一边测试;

layout src:显示源代码窗口;

layout asm:显示反汇编窗口;

layout regs:显示源代码/反汇编和CPU寄存器窗口;

layout split:显示源代码和反汇编窗口;

display: 在每次单步进行指令后,紧接着输出被设置的表达式及值;

stepi或nexti:单步跟踪一些机器指令;

Ctrl + L:刷新窗口;

quit:简记为 q ,退出gdb;

回车:重复上一条命令;

执行下一步操作,注意命令行此时显示的并不是当前执行的操作,而是下一次要执行的。

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2016-07-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏栗霖积跬步之旅

异常:This application has no explicit mapping for /error, so you are seeing this as a fallback.

出现这个异常说明了跳转页面的url无对应的值. 原因1: Application启动类的位置不对.要将Application类放在最外侧,即包含所有子包  原因...

8286
来自专栏WindCoder

WebService入门初使用(二)调用WebService服务

上一节记录完WebService的创建,鉴于篇幅所致,将调用部分单独拿到本节,所调用WebService服务基于上一章节内容。

1652
来自专栏Linyb极客之路

分布式框架之Dubbo学习小记

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。其核心部分包括:

1312
来自专栏学海无涯

Java Web之MySQL在项目中的使用

尴尬:access denied for user ’root’@’localhost’ using password yes 有时候,在连接 MySQL 数据...

2716
来自专栏大内老A

并发中的同步--WCF并发体系的同步机制实现

在《WCF 并发的本质》中,我们谈到了WCF提供的三种不同的并发模式,使开发者可以根据具体的情况选择不同的并发处理的策略。对于这三种并发模式,Multiple采...

1865
来自专栏Java进阶架构师

02:SpringBoot整合SpringDataJPA实现数据库的访问(一)

Spring Data JPA等于在ORM之上又进行了一次封装,但具体的对数据库的访问依然要依赖于底层的ORM框架,Spring Data JPA默认是通过Hi...

711
来自专栏资深Tester

一定要知道的,那些Linux操作命令(二)

2196
来自专栏运维小白

Linux基础(day14)

4.1 df命令 df命令介绍 df命令,汇报文件系统磁盘的使用情况 [root@localhost ~]# df 文件系统 1K-块 ...

2107
来自专栏用户2442861的专栏

HTTP POST GET 本质区别详解

    一般在浏览器中输入网址访问资源都是通过GET方式;在FORM提交中,可以通过Method指定提交方式为GET或者POST,默认为GET提交

2942
来自专栏Hongten

Java Web log4j (日志)

private static Logger logger=Logger.getLogger(Example.class);

1852

扫码关注云+社区

领取腾讯云代金券