• gdb调试器


    编译时要加上-g参数

    利用gdb对一个可执行文件进行调试的命令为:

    gdb filename

    这告诉gdb装入filename的可执行文件进行调试。

    gdb常用命令

    quit - 退出gdb,简写“q”

    run - 执行当前被调试程序,简写“r”

    kill - 终止正在调试的程序

    step - 执行一行源代码而且进入函数内部,简写“s”

    next - 执行一行源代码不进入函数内部,简写“n”

    break - 设置断点

    backtrace - 回溯跟踪,简写“bt”

    frame n - 定位到发生错误的代码段,n为backtrace 命令输出结果中的行号

    print - 打印表达式或变量的值,或打印内存中某个变量开始的一段连续区域的值,还可以用来对变量进行赋值

    display - 设置自动显示的表达式或变量,当程序停住或在单步跟踪时,这些变量会自动显示其当前值

    list - 列出产生执行文件的源代码的一部分

    jump - 使程序跳转执行


    使用方法

    1.使用断点

    dgb下的常用命令(break, list ,jump等)后面都可以跟不同的参数,使命令变得更加灵活。这些参数为:

    • <linenum>-------------------行号
    • <function>-------------------函数名
    • <+offset>-------------------当前行号的正偏移量
    • <-offset>--------------------当前行号的负偏移量
    • <filename:linenum>--------某个文件的某一行
    • <filename:function>--------某个文件的某个子函数
    • <*address>-----------------程序运行时的语句在内存中的地址
    • break <function>---------进入指定函数停住
    • break <linenum>---------指定行号停住
    • break +offset -------------在当前行号的前面offset停
    • break -offset --------------在当前行号的后面offset停
    • break filename:linennum-在源文件filename的linenum停
    • break filename:function--在源文件filename的function函数入口停
    • break *address------------在程序运行的内存地址停

    2.查看运行时数据

    2.1 print命令(简写p)

    print的格式

    print <expr>

    print /<fmt> <expr>

    <expr>是表达式,<fmt>是输出格式,如按十六进制输出,则是/x。

    2.2 输出格式

    • x - 十六进制
    • d - 十进制
    • u - 按十六进制显示无符号整型
    • o - 八进制
    • t - 二进制
    • a - 十六进制
    • c - 字符格式
    • f - 浮点格式

    2.3 自动显示命令display

    格式

    display <expr>

    display /<fmt> <expr>

    display /<fmt> <addr>

    <expr>是表达式,<fmt>是输出格式,<addr>表示内存地址

    设置好表达式(可以是变量)后,以后每一步都会显示设置好的表达式。

    2.4 查看内存

    使用examine命令(简写x),语法如下

    x/<n/f/u> <addr>

    参数说明如下:

    •  n,f,u是可选参数,可以独立使用,也可以联合使用。
    • n是一个正整数,表示显示内存长度,即从当前地址向后显示n个地址的内容。
    • f表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s;如果是指令地址,格式可以是i。
    • u表示从当前地址向后请求的字节数,如果不指定的话,gdb默认是4byte。u的参数可以用下面字符代替:b表示单字节,h表示双字节,w表示4字节,g表示8字节。当指定字节长度后,gdb会从指定的内存地址开始,读写指定字节并把它当作一个值取出来。
    • <addr>表示内存地址。

     3 查看源代码

     使用list

    • list <function>---------显示名为function函数的源程序
    • list <linenum>---------显示第linenum行周围的源程序
    • list ----------------------显示当前行后面的源程序
    • list -  -------------------显示当前行前面的源程序,一般上5后5或上2后8,默认10行
    • set listsize <count>----设置一次显示源代码的行数
    • show listsize------------查看当前listsize的设置
    • list <first>,<last>-----显示从first到last行之间的源程序
    • list ,<last>-------------显示从当前行到last行之间的源程序

    源代码的内存,使用info line+“行号”,“函数名”,“文件名:行号”,“文件名:函数名”等,可查看其在内存中的地址。

    查看汇编代码,使用disassemble +“行号”,“函数名”,“文件名:行号”,“文件名:函数名”。


    4.改变程序的执行

    4.1修改变量值

    使用print修改,如 print x = 9

    4.2跳转执行

    使用jump <linespec> 和 jump <address>

    4.3强制函数返回

    使用return 或 return <expression>

    4.4强制调用函数

    call <expr> 或 print <expr>

  • 相关阅读:
    [NM]打开NetworkManager和wpa_supplicant的DEBUG接口
    TI am335x am437x PRU
    Ansible and FileBeta
    [gpio]devm_gpiod_get_optional用法
    TCP连接
    STM32云平台连接培训20180814
    select理解
    TypeScript躬行记(1)——数据类型
    React躬行记(15)——React Hooks
    React躬行记(14)——测试框架
  • 原文地址:https://www.cnblogs.com/ivorfeng/p/3059594.html
Copyright © 2020-2023  润新知