菜单

之所以gdb调试代码

2018年12月18日 - Php

借用设线上发平等段落php脚本,突然在某天出问题了,不处理不过经过没有脱离。这种处境可能是丰硕休眠或者是发出段子死循环代码,不过我们怎么固定为,我们是时节太惦念明白之应是者剧本在这在举行呀吧。这么些是gdb+zbacktrace就出因而了


首先随便写一个测试脚本test.php,里面纵使写一个sleep函数,换成死循环也足以。

title: 用gdb调试代码
tags:

<?php
function Mecho($i){
 echo $i.PHP_EOL;
}
$i = 20;
while($i>0){

if($i%2==0){
  Mecho($i);
}
sleep(100000);
$i--;
}

zbacktrace下载php源码包中就闹,当前自的环境是新装的,当前之php版本是php7.2.9


直接cli执行test.php

gdb调试

$ gdb execfile

始于调试execfile;

php test.php
list

list,简写为l,显示源文件;命令格式:

list | l [arg1,arg2]

arg1也从始行号,arg2吗了却行号;显示arg1行到arg2行之间的代码;

莫设置arg1和arg2 时,默认突显10举行;

(gdb) l
#显示1-10行代码

 然后找到时php进程

break

break,简写b,设置断点;命令格式:

break | b  location

location可以是function(函数称作) | linenum(行号) | address(偏移地址);

(gdb) b _start
(gdb) b *_start + 4
(gdb) b 14

   图片 1

run、stepi、info

 然后用gdb调试

run

run,简写r,运行程序;

gdb -p 56571
stepi

stepi,简写si,执行同样长达指令;命令格式:

stepi | si [N]

N意味着执行N条指令(或者到程序停止处);

(gdb) si
# 执行一条指令
(gdb) si 4
# 执行四条指令

 调试

info

info,简写i,显示有调试音讯;

info registers -- List of integer registers and their contents
#可以简写为 i r
info breakpoints -- Status of specified breakpoints (all user-settable breakpoints if no argument)
#简写 i b
source /usr/local/src/php-7.2.9/.gdbinit
zbacktrace 
print

print,简写pExamining
Data
,打印寄存器中的价值或打印变量中的价;命令格式:

print | p [/fmt] $registers | variable

registers代表寄存器,如eax,ebx,ecx,edx,esi, edi, esp, ebp,
eflags等;
fmt参数如下表:

format letter description
o octal
x hex
d decimal
u unsigned decimal
t binary
f float
a address
i instruction
c char
s string
z hex,zero padded on the left
(gdb) p $eax
#打印寄存器eax中的值
(gdb) p Snippet
#打印Snippet中的值

图片 2

examine

x,全称:examine;Examining
Memory
,打印内存单长遭之价;命令格式:

x/nfu address

address表示内存单元地址;
n是一个整数,表示显示几乎只内存单元;默认是1;
f表示格式化,见上表;默认是x;
u表示内存单元大小,见下表:

unit letter description
b Bytes
h HalfWords(two bytes)
w Words(four bytes, default)
g Giant words(eight bytes)
(gdb) x/5cb &Snippet
#从Snippet所在的地址开始打印连续的5个以字节为单位的内存单元,并以字符的形式显示;
(gdb) x/5cb 0x6000c8;
#从地址为0x6000c8的内存单元开始打印;

 这一个时段便明白了是以test.php的11履行 sleep函数导致的经过sleep。

display

displayAutomatic
Display
,自动展现,每一遍运行了一长达指令自动打印展现列表中的价;命令格式:

display[/fmt] expr | address

display会依照设置的fmt,expr或者address自动判断是调用x还是print

(gdb) display/5xb &Snippet
#等价于每次执行完一条指令后,自动执行一次x/5xb &Snippet;
(gdb) display/x $ebx
#相当于每次执行一条指令后,自动执行一次p/x $ebx;

  

quit

quit,简写q,退出gdb;

 

shell

亟需在gdb中履行shell命令时,能够使shell;命令格式:

shell command

TUI模式

gdb提供TUI(Text User Interface)情势,方便调试代码;

进入TUI模式

利用gdb -tui execfile命令进入gdb,能够打开TUI格局;
进gdb之后经过飞快键ctrl+x a要么应用命令tui enable开启TUI模式;

layout

足行使layout命令调整TUI中的布局;通过help layout好查阅协助;命令格式:

layout next | prev | layoutname

next下一个布局,prev上一个布局,layoutname见下表:

layoutname description
src 源码布局
asm 汇编布局
split 源码,汇编,cmd布局
regs 寄存器布局
winheight

调整布局的分寸,命令格式:

winheight winname [+ | -] lines

winname见下表:

winname description
src 源码窗口
asm 汇编窗口
cmd 命令窗口
regs 寄存器窗口

+代表窗口winname增大lines行,-代表窗口winname减小lines行;

focus

利用focus足给问题关注不同之窗口;命令格式:

focus next | prev | winname

next下一个窗口,prev上一个窗口,winname见上表;
当cmd不被focus时,在cmd中方向键不起效率,若要动方向键,此时来势键命令同emacs一样(ctrl+p向上,ctrl+n向下,ctrl+f向右,ctrl+b向左);

refresh

refresh刷新窗口;

关闭TUI模式

ctrl+x a既然可以开TUI,也得以关闭TUI;
tui disable关闭TUI模式;

参考:
Debugging with
GDB

Quick GDB
Information

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图