GDB
https://www.bilibili.com/video/BV1q441127uN?from=search&seid=10088908157042936822
https://www.bilibili.com/video/BV1Y4411m7XQ/?spm_id_from=333.788.videocard.0
http://blog.csdn.net/haoel/article/details/2880
http://blog.csdn.net/haoel/article/details/2881
http://blog.csdn.net/haoel/article/details/2883
http://blog.csdn.net/haoel/article/details/2884
http://blog.csdn.net/haoel/article/details/2885
GDB
进到vs中进不到的函数中,在GBD中可以执行写内存的操作,可以动态改变变量的值,动态改变
进入寄存器等,断点调试(条件断点);
- 三种GDB启动方式
1. gdb test 2. gdb test core(GDB出现段错误时,产生core,启动时直接跳到该位置)段错误(数组越界,内存溢出) int *a = 0; //没有申请内存,给野指针赋了值 *a = 100; 3. gdb test pid (可以调试在执行的程序) gdb pid ps -A (ps查看进程 -A查看所有的) pid
- 寄存器
寄存器(临时存储介质,时间短)(CPU的一部分,CPU内部的缓存)
32位中有
eax ebx esi edi esp ebp eip flag
32位中函数调用时的参数不要超过四个(eax ebx ecx edx),在加就会在内存中取,
所以传参数时不能传结构体本身,要传结构体指针
esi 源寄存器
edi 目的寄存器
esp 栈顶寄存器
ebp 栈底寄存器
eip 程序运行到哪,eip就指向那
flag 状态寄存器
c 跳到下一个断点 u 退出循环体 r s F10(VS)进入函数的下一步 n F11(VS)不进入函数内部的下一步 f 结束当前函数 bt 函数调用栈,函数调用关系(先调用那个。。。) x 内存 x/ ifo locals i 查看变量i q 退出 gdb help tab补全 set listsize 30 l 10 show listsize l 10,20 l test.c:20
- 设置命令行参数(传入时)
set args 10 20 30 40 50 shell + 命令 shell ls shell pwd
- 断点
断点 b 18 b func b main.c:18 b display.c:func info
观察点 watch sum 变量名 有变化就停止 (写入) info watchpoint c rwatch sum 当该变量被读取时就停止 awatch sum 当该变量被访问时就停止 == 被读或写时
捕捉点 catch 1. catch throw catch catch 2.catch exec 捕捉系统发生execve系统调用时 暂停程序 ./helloworld 内核调用exec启动程序helloworld 3.catch fork 调用fork时就停止 fork在Linux中为创建进程 4.catch vfork 也是进程 vfork创建轻量级进程() 5.catch load 载入动态链接库时停止 6.catch unload 卸载动态链接库时停止 try是应用层进入内核层的关键(eg驱动)windows
assert 断言函数 char *str 若为空,则报错 gdb display core gdb -tui ./display 以界面的方式启动 执行gdb 直接layout vi makefile l display_afw set listsize 30 循环的地方设置断点 gdb gdbing c 跳到下一个断点 print查看命令 内存 变量 查看数组 int a[10] print *a@10
display 自动执行命令
自动显示变量 display *pbuf@7 数组 info display undisplay 1 直接不显示 delete display num disable display num y n enable display num display/i $pc 以二进制的形式 自动显示 汇编代码的方式 pc指针 运行到哪条指令,显示汇编指令 显示每次执行的汇编命令
info threads 查看线程 print counter 打印计数器的值 thread 2 让当前正在调试2 set scheduler-locking 开启这个机制:只有当前正在运行的进程运行,其他的都出在阻塞状态
x/nfu
x显示内存,
n是个数
f格式
u单位
靠技术实力称霸,千面鬼手大人万岁!