zoukankan      html  css  js  c++  java
  • 使用gdb

    1、设置断点,在源程序第16 行处

    (gdb)break 16 
    Breakpoint 1 at 0x8048496: file tst.c, line 16.

    2、设置断点,在函数func()入口处。

    (gdb)break func 
    Breakpoint 2 at 0x8048456: file tst.c, line 5.

    3、查看断点信息。

    (gdb)info break 
    Num Type Disp Enb Address What
    1 breakpoint keep y 0x08048496in main at tst.c:16
    2 breakpoint keep y 0x08048456 in func at tst.c:5

    4、

    (gdb)run ——————运行程序 r
    (gdb)next ——————单条语句执行。 n
    (gdb)continue ——————继续运行程序 c

    5、查看所有参数

    (gdb)in all
    info local 查看当前变量

    6、打印变量i 的值(gdb)print i p i

    $1 = 134513808
    (gdb) p g_uiTblmIdSwitchControl 
    $1 = -1 
    (gdb) p g_uiTblmLogSwitchControl = 1 
    $2 = 1 
    (gdb) p g_uiTblmIdSwitchControl = 74 x 
    $3 = 74 
    (gdb) q

    7、查看函数堆栈

    (gdb)bt
    #0 func (n=250) at tst.c:5
    #1 0x080484e4 in main () at tst.c:24
    #2 0x400409ed in __libc_start_main () from /lib/libc.so.6

    8、退出函数

    (gdb)finish
    Run till exit from #0 func (n=250) at tst.c:5
    0x080484e4 in main () at tst.c:24
    24 printf("result[1-250] = %d 
    ", func(250) );
    Value returned is $6 = 31375

    9、 退出gdb
    (gdb)quit

    10、查看内存内容

    x /160xb 0x43964d80

    该命令的具体语法格式为 x<n/f/u><addr> n、f、u是可选参数。

    n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
    f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。
    u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字 节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。

    <addr>表示一个内存地址。
    n/f/u三个参数可以一起使用。例如:命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。

    输出格式
    一般来说,GDB会根据变量的类型输出变量的值。但你也可以自定义GDB的输出的格式。例如,你想输出一个整数的十六进制,或是二进制来查看这个整型变量的中的位的情况。要做到这样,你可以使用GDB的数据显示格式:

    x 按十六进制格式显示变量。
    d 按十进制格式显示变量。
    u 按十六进制格式显示无符号整型。
    o 按八进制格式显示变量。
    t 按二进制格式显示变量。
    a 按十六进制格式显示变量。
    c 按字符格式显示变量。
    f 按浮点数格式显示变量。
    (gdb) p i
    $21 = 101 
    
    (gdb) p/a i
    $22 = 0x65
    
    (gdb) p/c i
    $23 = 101 'e'
    
    (gdb) p/f i
    $24 = 1.41531145e-43
    
    (gdb) p/x i
    $25 = 0x65
    
    (gdb) p/t i
    $26 = 110010

    11、查看数据结构

    p *(struct link_map *)0x7fab515fe000

    12、gdb -p 子进程

    13、watch *(int*)监控4字节地址 用户态修改

    14、如果core文件出现两个线程,如

    [New LWP 221856]
    [New LWP 217511]
    
    t 2
    bt
    就可以看到第二个线程对应的调用栈,thread apply all where 查看所有线程

    15、强制调用函数

    使用call或print命令 直接调用函数执行

    16、生成内核转存文件

    gcore 命令生成core文件 

    17、函数短接

    gdb下输入:
    b LSPIC_LinkAlmPer_InsLinkAlm
    commands
    return (unsigned int)0
    c
    end

    18、观测点

    watch len,可以加观测点,值变化的话会有打印信息,或者告警

     19、gdb下需要输入参数

    set args prama1 prama2
  • 相关阅读:
    【1】【leetcode-33,81】 搜索旋转排序数组
    【leetcode-82,83,26,80】 删除排序链表/数组中的重复元素
    【leetcode-84】 柱状图中最大的矩形
    Objective-C之run loop详解
    ReactiveCocoa
    IOS响应式编程框架ReactiveCocoa(RAC)使用示例
    通过WireShark抓取iOS联网数据实例分析
    Receiver type for instance message is a forward
    Swift 高级运算符
    ios Instruments 内存泄露
  • 原文地址:https://www.cnblogs.com/xingmuxin/p/11413705.html
Copyright © 2011-2022 走看看