除錯檢視PHP Core的呼叫棧

2021-09-19 19:00:32 字數 1821 閱讀 3835

php gdb.php **如下:

<?php

class test

function a($i)

function b($i)

function c($i)

function d($i)

function e($i)

a(2);

使用php cli模式執行指令碼

/usr/local/php-7.3.4/bin/php gdb.php
檢視php命令對應的程序pid

ps -ef | grep gdb

root 148 41 0 14:51 pts/2 00:00:00 /usr/local/php-7.3.4/bin/php gdb.php

root 150 19 0 14:51 pts/1 00:00:00 grep --color=auto gdb

然後使用gdb除錯php程序

gdb -p 148
然後進去除錯呼叫棧,還可以檢視array和object資料

(gdb) source /tmp/php-7.3.4/.gdbinit

(gdb) zbacktrace

[0x7f5f83c1d340] sleep(1000) [internal function]

[0x7f5f83c1d2d0] e(false) /data/www/test/gdb.php:20

[0x7f5f83c1d230] d(true) /data/www/test/gdb.php:16

[0x7f5f83c1d1c0] c(array(3)[0x7f5f83c1d210]) /data/www/test/gdb.php:12

[0x7f5f83c1d130] b(object[0x7f5f83c1d180], , 2.343200) /data/www/test/gdb.php:9

[0x7f5f83c1d0a0] a(2) /data/www/test/gdb.php:6

[0x7f5f83c1d030] (main) /data/www/test/gdb.php:23

(gdb)

(gdb) print ((zval *)0x7f5f83c1d210)

$1 = (zval *) 0x7f5f83c1d210

(gdb) printzv $1

[0x7f5f83c1d210] (refcount=2) array: packed(3)[0x7f5f83c5f1f8]:

(gdb)

(gdb) print ((zval *)0x7f5f83c1d180)

$2 = (zval *) 0x7f5f83c1d180

(gdb) printzv $2

[0x7f5f83c1d180] (refcount=1) object(test) #1

properties hash(0)[0x7f5f83c0d090]:

使用php7.0.31版本除錯,會遇到如下問題:

php-src-php-7.0.31/ php-two-psr/

(gdb) source /data/www/php-src-php-7.0.31/.gdbinit

(gdb) zbacktrace

no symbol "basic_functions_module" in current context.

(gdb)

更換為php7.3才能正常檢視;

重現PHP Core的呼叫棧

以前,我曾經介紹過如何通過php的core檔案獲取資訊 如何除錯php的core之獲取基本資訊 對於呼叫引數這塊,當時介紹的獲取方法比較複雜.於是今天我為php 5.4的.gdbinit做了乙個改進,以後如果你遇到了php 5.4的core,那麼就可以簡單的得到php 5.4發生core時,包括引數...

gdb除錯(檢視函式棧 除錯coredump檔案)

檢視函式棧用在gdb中用bt,觀察變數值用watch 變數值發生變化時會暫停程式的執行 一 除錯coredump檔案 什麼是core dump?core的意思是記憶體,dump的意思是扔出來,堆出來.一般以core.程序號的檔案呈現,可以知己設定,這個檔案便是作業系統把程式down掉時的記憶體內容扔...

檢視核心函式呼叫的除錯方法 原創

方法一 通過列印函式位址,可以檢視函式在 呼叫 例如 core.c drivers pwm int pwm config struct pwm device pwm,int duty ns,int period ns if pwm period ns 0 duty ns period ns retu...