zoukankan      html  css  js  c++  java
  • NDK学习笔记-gdb调试

    在做开发的时候,难免会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

  • 相关阅读:
    Java学习笔记
    Winform中ListView设置了ColumnHeader不显示问题
    GitHub私有仓库为他人授权
    (转)一步一步教你如何在GitHub上上传自己的项目
    【转】C#中的Explicit和Implicit
    C#对象深表复制方法
    mongodb 设置 ssl
    zabbix 4.0.1部署
    redis编译安装
    VMware网络连接模式——桥接模式、NAT模式以及仅主机模式的介绍和区别
  • 原文地址:https://www.cnblogs.com/cj5785/p/10664648.html
Copyright © 2011-2022 走看看