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. 用户态函数调用栈打印

工具代码路径

相关文章

  • python调试

    linux python调试技巧 Linux下Python基础调试 http://blog.163.com/liu...

  • linux编程入门(七)-使用gdb调试程序

    程序开发离不开调试,可以断点调试,也可以打log调试,linux下断点调试c,c++程序用gdb。 断点调试虽然很...

  • PWN入门到放弃

    Linux下的pwn常用到的工具有: gdb:Linux调试中必要用到的 gdb-peda:gdb方便调试的工具,...

  • 2018-09-18 Linux内核调试

    【Gooooood转】Linux内核调试方法总结

  • Linux程序调试方法汇总

    Linux下程序的调试方法汇总 在linux中讨论调试工具主要是为那些入门者提供一些帮助。调试工具能让我们能够监测...

  • Linux print system

    Linux print system linux中的调试方法有很多种,但我们最常用的也是最关键的调试工具应该就是使...

  • VS2017创建并调试LINUX程序

    原创,转载请申明宇宙第一IDE以前没办法用在linux程序先,现在不仅能在python上调试也能调试linux程序...

  • windows下使用vs studio调试Linux下代码

    linux下使用gdb调试c的代码,很不直观,也很不方便,如果能够在windows下的IDE下调试linux的c代...

  • 死锁排查

    参考 Linux_Applications_Debugging_Techniques/Deadlocks 如何调试...

  • 移动端之Chrome远程调试

    原理 安卓远程调试支持所有操作系统(Windows,Mac, Linux, and Chrome OS.)中调试,...

网友评论

    本文标题:linux调试

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