linux调试

作者: Markz__ | 来源:发表于2021-01-27 15:32 被阅读0次

    1. GDB调试

    1.1 断点

    b/break + 函数名
    b/break + 文件名:行号
    delete breakpoints 2 : 删除断点
    disable/enable breakpoints 3 : 禁用/启用断点
    break 9 if sum != 0 : 满足条件激活断点

    1.2 显示信息

    i/info 显示信息
    i breakpoints : 显示断点
    i registers : 显示寄存器的当前值
    i thread : 查看当前程序中的线程(info thread)
    线程信息列名显示如下:
    序号 线程ID 线程名 当前所在的指令地址或函数 当前所在的指令地址对应的c代码

    List/l : 列出源码
    Disassemble : 反汇编当前函数或指定函数

    1.3 设置线程

    设置当前操作的线程: thread tnum
    针对指定线程使用命令:thread apply tnum cmd
    查看指定线程调用栈: thread apply tnum bt

    1.4 调试步骤

    r/run : 重新从程序开头连续运行
    c/continue: 程序继续
    s : 单步调试,进入函数(F11)
    finish : 退出函数
    N: 单步调试, 不进入函数(F10)
    Bt : 查看函数调用堆栈
    Quit : 退出gdb

    1.5 变量值

    p/print + 变量: 打印变量
    set var sum = 0 : 修改变量值
    修改变量的值:set variable = val
    修改内存的值:set *(type *)address = val , print (type)address=val
    修改寄存器的值:set regname = val , printregname = val

    查看内存值:x [/nfu] address
    N 指定要打印的内容的个数
    F 指定按照何种格式打印
    U 指定每个内容的长度 包括: byte halfword word giant(8bytes)

    查看结构体的大小: print sizeof(stuctrue)
    查看结构体中成员的偏移:print &((struct*)0x0)->member
    显示当前的指令:display /I $pc
    设置结构体变量显示格式:set print pretty
    程序被断点中断时执行自定义的操作:
    Commands [bnum]
    …..command-list….
    End
    为断点设置条件:condition bnum expression

    1.6 gdb 调试进程

    gdb attach pid
    断开gdb连接:Disconnect
    断开gdb连接并让程序正常运行:detach

    调试子进程时需要set follow-fork-mode child
    切换为父进程时: set follow-fork-mode parent

    1.7 调试CORE文件

    Gdb excuteFileName coreFile

    1.8 gdb ko

    gunzip vsr100x_x86_64.ko
    gdb ****.ko
    list *Fwd_Data(函数名) + 0x3c1 查看c代码行数
    p sizeof(struct) 查看结构体大小
    p 变量 查看值

    1.9 调用函数

    设置出参:
    例如:定义并初始化出参:set $outVar1 = (char*)malloc(256)
    调用函数: call func1(inVar1,inVar2,$outVar1)
    查看调用后返回的出参 print $outVar1

    2. KDB调试

    2.1 kdb环境准备

    release 版本需要加载devkit包
    bash里查看kdb开关,1表示打开:cat /proc/sys/kernel/kdb

    将kdb打开或关闭:
    Echo “1” > /proc/sys/kernel/kdb
    Echo “0” > /proc/sys/kernel/kdb
    Debug版本不需要做这些动作

    按键盘上的 Pause Break键可进入kdb

    2.2 CPU切换

    CPU 查看cpu信息
    Cpu 1 切换到cpu1,每个cpu有不同的运行栈

    2.3 kdb 断点设置

    Bp 函数名 设置断点
    Bp/bl 查看所有断点( break point/ break list)
    Bp #0 查看第0个断点
    Bc 0 清除第0个断点
    Bc * 清楚所有断点
    Bd 0/* 使第0个/所有断点无效
    Be 0/* 激活第0个/所有断点
    ? 查看更多命令
    Go 继续运行
    Ss : 单步执行程序:仅仅执行下一条指令,执行完后停止
    Ssb: 执行到分支或者函数调用时停止:与ss的区别是ss只执行一条语句,ssb执行一组语句,它使指令继续执行,在遇到一个分支语句或者函数调用语句时停止。

    查看调用栈(命中断点后):
    Bt : 查看该CPU上调用栈关系(代码中添加dump_stack可打印调用栈,类似与bt效果)
    Bta: 查看所有CPU上调用栈关系
    Btp pid : 查看进程的调用栈关系

    反汇编: ld函数名 , id翻页

    函数入参的观察办法:
    Bt通常会打印出入参
    通过rd命令查看寄存器,参数顺序如下:
    Ax dx cx bx --- x86 32
    Rdi rsi rcx r8 r9 -----x86 64 其他的保存在堆栈上
    Rax 作为返回值

    内存信息观察,内存修改:
    查看变量的内存地址 md g_ulDrvFwdPolicy (memory display)
    修改内存地址mm g_ulDrvFwdPlicy xxx ( memory modify)
    解析函数指针数组 mds g_apfCheckFunc

    2.4 异常信息观察

    可查看printk 打印的消息
    Dmesg 10 打印最近10行
    Dmesg

    硬件断点(虚拟机上不支持)
    Bph [vaddr [datar | dataw | io [length]]]
    Bph g_ulDrvFwdPolicy dataw

    进入KDB控制台时,会打印进入KDB的原因,及基础信息,格式一般如下:
    Entering kdb (current=0Xaddr , pid PID)on processor CPU due to REASON

    3. 用户态函数调用栈打印

    工具代码路径

    相关文章

      网友评论

        本文标题:linux调试

        本文链接:https://www.haomeiwen.com/subject/wtxxtltx.html