介绍Linux 调试内核,调试应用程序
基本命令
man gdb
查看命令帮助信息,q退出r
运行调试n
下一步c
继续运行ctrl+c
中断后续运行s
进入一个函数finish
退出函数l
列出代码行 比如 l main l xxx.go:1b
断点info b
显示断点列表delete number
删除断点clear
清除断点until 2
跳转至行号p
打印 p/x 按十六进制显示变量bt/backtrace <-n>
显示所有栈帧,栈 -n 表一个负整数,表示只打印栈底下n层的栈信息bt full
显示栈帧以及局部变量info frame <栈帧编号>
查看帧详细信息f/frame <number>
进入指定堆栈层thread apply all bt
显示线程所以堆栈attach <-p pid>
绑定进程调试detach
取消绑定调试disassemble <func>
查看二进制数据x
查看内存focus
显示源码界面display *entry
显示变量display <num>
取消显示info registers
查看寄存器gdb -p xxx
调试根据进程号ctrl + c
中断程序ptype xxx
查看对象类型disable <断点编号>
当前断点设置为无效enable <断点编号>
当前断点设置为有效x $pc
显示程序指针指向位置的内容x/i $pc
显示程序当前位置的汇编指令x/10i $pc
显示程序当前位置开始往后的10条汇编指令disassem $pc
反汇编当前函数。简写为:disas $pc
gcore
生产dump文件
Linux内核调试
虚拟机内核编译调试
- 修改内核源码增加系统调用
- 编译,修改启动项目进入新内核
- 内核运行在qemu,gdb调试,断点可以打在系统调用入口处
写个小程序编译的时候加-g 表示加入调试信息。
Redis调试
安装:
1 | wget http://download.redis.io/releases/redis-6.2.3.tar.gz # 下载 |
修改Makefile内容:
1 | 关闭编译优化 |
编译
1 | make |
调试过程
1 | gdb --args ./src/redis-server redis.conf # 启动调试 |
1 | redis-cli set abc abc # 开启一个新的Shell终端进行操作,启动client |
1 | [root@test redis-6.2.3]# gdb --args ./src/redis-server redis.conf |
1 | focus # 进入源码调试窗口 |
1 | dict.cqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk |
后面不是同一次操作,内存地址可能对应不上。layout regs
打开寄存器窗口
1 | lqqRegister group: generalqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk |
layout asm
打开汇编窗口
1 | B+>x0x4352ed <dictAdd+20> mov -0x20(%rbp),%rcx x |
layout src
源码窗口
1 | lqqdict.cqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk |
ctrl+x+a
关闭窗口
java调试
- 普通javadebug配置
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5555 -jar ~/test.jar
- tomcat开启debug模式
./catalina.sh jpda start;
默认端口8000 - java使用JDB命令。
- 普通java程序
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=5555
- tomcat部署方式下jdb连接debug端口
jdb -attach localhost:8000
- 基本命令
stop at com.xx.xxx.abc:10
clear
print x
next