在做开发的时候,难免会crash,那么在这时候需要进行调试,在C/C++的代码调试中,gdb是很常用的gdb在这不做过多介绍,之前在C语言中已经做过总结,这里简要回顾一下

  • 要使用gdb,在编译的时候需要添加-g参数

    gcc test.c -g -o test
  • 进入调试

    gdb test
  • 开始调试

    start

显示gdb命令帮助信息

help 显示gdb命令种类

help subcommand 显示subcommand的帮助信息

apropos word 搜索与word相关的命令

设置断点

b(break) 在函数或某一行处设置断点,如果只记得部分函的前缀,可以这样:(gdb) b make_ <按TAB键>

break filename:linenum 在源文件filenamelinenum行处停住

break filename:function 在源文件filenamefunction函数的入口处停住

break *address 在程序运行的内存地址处停住

break break命令没有参数时,指在下一条指令处停住

break … If … 在条件成立时程序停住

break thread threadnum 定义在线程threadnum上的断点,如break BootAnimation.cpp:364 thread 28 if bartab > lim

设置观察点

watch expr 设置观察点,当表达式expr的值变化时,程序停住

rwatch expr 设置观察点,当表达式expr的值被读时,程序停住

awatch expr 设置观察点,当表达式expr的值被读或写时,程序停住

设置捕捉点

catch 设置被调试程序捕捉点,当event发生时,程序停住

catch catch [args] 捕捉一个C++捕捉到的异常

catch throw [args] 捕捉一个C++抛出的异常

catch syscall [args] 捕捉系统调用

维护被调试程序断点

condition N COND 修改断点号为N的停止条件为COND

ignore N COUNT 忽略断点号为N的停止条件COUNT

clear [linenum|funname|*] 清除指定的行或函数断点

d(delete) [breakpoints][range] 清除指定的断点

disable [breakpoints] [range…] 禁用指定的断点

enable [breakpoints] [range…] 启用指定的断点

为停止点设定运行命令

commands N 调试程序在断点号为N的断点处停止后,执行命令执行命令

end

显示被调试程序的信息

info subcommand 显示被调试程序的某些信息,可用help info查看子命令。如:

info breakpoints [n] 显示所有断点(或断点n)信息

info watchpoints [n] 显示所有观察点(或观察点n)信息

info program 查看被调试程序的执行状态

info args 打印出当前函数的参数名及其值

info locals 打印出当前函数中所有局部变量及其值

info display 查看display设置的自动显示的信息

info frame 查看栈帧信息,包括程序语言

运行及查看被调试信息

r(run) 运行被调试程序

c(continue) 从断点出开始继续执行直到结束或下一个断点

s(step) 单步跟踪,如果有函数调用,他会进入该函数。进入函数的前提是此函数被编译有debug信息

n(next) 单步跟踪,如果有函数调用,他不会进入该函数

p(print) 打印表达式的值 可以查看全局变量(所有文件可见)、静态全局变量(当前文件可见)、局部变量(当前Scope可见)

p file::var 查看文件file中的变量var

p func::var 查看函数file中的变量var

p start@len 查看一段连续的内存空间的值,“@”的左边是第一个内存的地址的值,“@”的右边则你你想查看内存的长度,如:

int array = (int ) malloc (len * sizeof (int));

p *array@len

p/format expr 按指定的格式显示表达式exprformat:x, d, f, c, u, o, t, a

display[/fmt] expr 程序停下来后就会显示expr的值

undisplay/delete displaynum/disable displaynum/enable displaynum

bt 查看当前函数调用堆栈信息

f(frame) 查看当前栈层信息,包括栈的层编号、当前的函数名、函数参数值、函数所在文件及行号和函数执行到的语句

finish 运行程序,直到当前函数完成返回

u(until) 运行程序直到退出循环体

显示源代码

l(list) 列出具体的函数或代码行

list 显示当前行后面的源程序

list - 显示当前行前面的源程序

list + 显示当前行后面的源程序

list linenum 显示程序第linenum行的周围的源程序

list file:filenum 显示文件file中的filenum

list file:func 显示文件file中的函数func

list funcname 显示函数名为function的函数的源程序,如list android::BootAnimation::movie

搜索源代码

forward-search reg 利用正则表达式前向搜索源码

search reg 利用正则表达式前向搜索源码

reverse-search reg 利用正则表达式在全部源码中进行搜索

设置被调试程序参数/gdb配置

set subcommand 设置gdb环境变量,可以使用help set查看set子命令。如:

set args 设置被调试程序运行参数

set directories 设置源文件搜索路径,多个使用“:”分割

set solib-search-path 设置符号表搜索路径

set environment varname [=value] 设置环境变量。如:set env USER=llj

set listsize num 设置一次显示源代码的行数

set step-mode on 打开step-mode模式,于是,在进行单步跟踪时,程序不会因为没有debug信息而不停住。这个参数有很利于查看机器码

set print address on 打开地址输出, 当程序显示函数信息时,GDB会显出函数的参数地址

set print array on 打开数组显示,打开后当数组显示时,每个元素占一行,如果不打开的话,每个元素则以逗号分隔

set print elements num 设置显示数组元素的最大个数

set print null-stop on/off 如果打开了这个选项,那么当显示字符串时,遇到结束符则停止显示

set print pretty on/off 打开后gdb显示结构体时会比较漂亮

set print sevenbit-strings 设置字符显示,是否按“/nnn”的格式显示

set print union on/off 设置显示结构体时,是否显式其内的联合体数据

show subcommand 显示调试器的信息,使用help show查看子命令。如:

show environment [varname] 查看环境变量

show listsize 显示当前listsize的设置

show directories 显示定义了的源文件搜索路径

show language 查看gdb当前的语言环境

其他

q(quit) 退出gdb

handle 处理信号

shell命令

此外gdb中可以执行shell命令,使用SHELL环境变量定义的可执行程序来执行shell命令,常用的命令如下:

show environment SHELL 查看shell执行程序

make 重新编译程序,相当于shell make

cd 必变工作目录,相当于shell cd

pwd 查看当前工具目录,相当于shell pwd

NDK学习笔记-gdb调试的更多相关文章

  1. 《软件调试的艺术》学习笔记——GDB使用技巧摘要

    <软件调试的艺术>学习笔记——GDB使用技巧摘要 <软件调试的艺术>,因为名是The Art of Debugging with GDB, DDD, and Eclipse. ...

  2. BIND9源码学习笔记1---gdb调试篇

    学习bind9源码之前,首先要知道如何用gdb来调试bind.BIND9的源码我是先看代码弄懂它的架构,像什么event-drive,epoll等, 再去看它的业务流程.看业务流程的时候要追踪它的数据 ...

  3. linux学习之四---gdb调试

    在Linux应用程序开发中,最经常使用的调试器是gdb. 一.启动和退出gdb gdb调试的对象是可运行文件,而不是程序的源码.假设要使一个可运行文件能够被gdb调试,那么使用编译器gcc编译时须要增 ...

  4. React学习笔记--程序调试

    React学习笔记 二 程序调试   前面我们搭建好了React的基本开发环境,可以编写基本的React js程序了.但完成的开发环境肯定包含调试器,怎么调试用React编写的JS程序呢?有浏览器,比 ...

  5. C学习笔记-gdb

    gdb即GNU debugger,用来调试程序 gdb使用前提 要使用gdb,则需要在编译源代码时候使用-g参数 gcc -g –o test test.c 启动gdb gdb 程序名 [corefi ...

  6. C/C++学习笔记_gdb调试

    1.前提条件:可执行文件包含调试信息 gcc -g 2.gdb 文件名 ---启动gdb调试 3.查看代码的命令 当前文件: list 行号(函数名) 指定文件: list 文件名:行号(函数名)4. ...

  7. NDK学习笔记-JNI多线程

    前面讲到记录到ffmpeg音视频解码的时候,采用的是在主线程中进行操作,这样是不行的,在学习了POSIX多线程操作以后,就可以实现其在子线程中解码了,也可以实现音视频同步了 简单示例 在native实 ...

  8. NDK学习笔记(四):OutputContext机制

    首先NDK文档中的Op.h头文件中已经有了相关概念的解释,摘录翻译如下: /*! \fn const OutputContext& Op::outputContext() const; The ...

  9. NDK学习笔记(三):DynamicKnobs的机制

    最近的NDK开发涉及到了动态input及动态knobs的问题. 开发需求如下:建立一个节点,该节点能获取每一个input上游的inputframerange信息. 具体下来就是:需要Node的inpu ...

随机推荐

  1. C#分隔字符串时遭遇空值

    在C#中分隔字符串时,按特定字符进行分隔的时候可能会遇到空值,如何我现在传入的是Id的字符串,如:"1501,1502,1503,,1505",以逗号分隔,由于各种原因,导致传入的 ...

  2. python--第四天练习题

    #1.写函数,利用递归获取斐波那契数列中的第 10 个数,并将该值返回给调用者. def rec(a,b,dep=1): c = a + b if dep == 10: return c return ...

  3. web开发下载文件夹

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用.此控件PC全平台支持包括mac,linux系统的文件上传,文章末尾将附上控件下载与教程链接 ...

  4. http 内容协商返回最适合的内容

    内容协商返回最命适的内容AcceptAccept-CharsetAccept-EncodingAccept-LanguageContent-Language内容协商技术有以下 3 种类型.服务器驱动协 ...

  5. OpenPyXl的使用

    OpenPyXl的使用 开始在内存中使用 创建一个workbook 在刚开始使用openpyxl的时候,不需要直接在文件系统中创建一个文件,仅仅需要导入Workbook类并开始使用它: >> ...

  6. Spring事务管理的一些注意点

    在<Spring Boot事务管理(下)>中,已经介绍了如果在 protected.private 或者默认可见性的方法上使用@Transactional,事务将是摆设,也不会抛出任何异常 ...

  7. 浏览器环境下的microtaks和macrotasks

    带有可视代码执行顺序的原文链接https://jakearchibald.com/201...,此篇文字并非其完整翻译,加入了一部分自己的理解,比如将其中的task替换为macrotask或是删除了可 ...

  8. 消息中间件MQ

    消息中间件MQ:为方便预览,将思维导图上传至印象笔记,博客园直接上传图片受限于图片大小 https://app.yinxiang.com/shard/s24/nl/27262531/c3e137a5- ...

  9. HTTP之持久连接

    HTTP/1.1 允许 HTTP 设备在事务处理结束之后将 TCP 连接保持在打开状态,以便为未来的 HTTP 请求重用现存的连接.在事务处理结束后仍然保持在打开状态的 TCP 连接被称为持久连接.非 ...

  10. powderdesinger显示中英文表名

     菜单->Tool->Model Options->Name Convention->右侧display中选择显示name还是code.不支持同时显示,但可以选择显示code, ...