gdb调试技巧 找到php执行过程近年来举行之代码

借用设线上出同等段落php脚本,突然在某天出题目了,不处理可是经过没有脱离。这种情状可能是甚休眠或者是发出段子死循环代码,可是大家怎么固定为,我们以此时节太缅怀了然的该是此剧本在这于召开什么吧。这一个是gdb+zbacktrace就发由此了


率先随便写一个测试脚本test.php,里面就形容一个sleep函数,换成死循环也得。

title: 用gdb调试代码
manbetx手机网页版,tags:

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

if($i%2==0){
  Mecho($i);
}
sleep(100000);
$i--;
}
  • gdb
    date: 2017-08-09 15:09:22

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

   manbetx手机网页版 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中的值

manbetx手机网页版 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地图