用gdb開啟php測試:
gdb /usr/local/php7/bin/php 進入gdb模式。
gdb用法如下:
執行run:簡記為 r ,其作用是執行程式,當遇到斷點後,程式會在斷點處停止執行,等待使用者輸入下一步的命令。
continue (簡寫c ):繼續執行,到下乙個斷點處(或執行結束)
next:(簡寫 n),單步跟蹤程式,當遇到函式呼叫時,也不進入此函式體;此命令同 step 的主要區別是,step 遇到使用者自定義的函式,將步進到函式中去執行,而 next 則直接呼叫函式,不會進入到函式體內。
step (簡寫s):單步除錯如果有函式呼叫,則進入函式;與命令n不同,n是不進入呼叫的函式的
until:當你厭倦了在乙個迴圈體內單步跟蹤時,這個命令可以執行程式直到退出迴圈體。
until+行號: 執行至某行,不僅僅用來跳出迴圈
finish: 執行程式,直到當前函式完成返回,並列印函式返回時的堆疊位址和返回值及引數值等資訊。
call 函式(引數):呼叫程式中可見的函式,並傳遞「引數」,如:call gdb_test(55)
quit:簡記為 q ,退出gdb
設定斷點
break n (簡寫b n):在第n行處設定斷點
(可以帶上**路徑和**名稱: b oagupdate.cpp:578)
b fn1 if a>b:條件斷點設定
break func(break縮寫為b):在函式func()的入口處設定斷點,如:break cb_button
delete 斷點號n:刪除第n個斷點
disable 斷點號n:暫停第n個斷點
enable 斷點號n:開啟第n個斷點
clear 行號n:清除第n行的斷點
info b (info breakpoints) :顯示當前程式的斷點設定情況
delete breakpoints:清除所有斷點:
檢視源**
list :簡記為 l ,其作用就是列出程式的源**,預設每次顯示10行。
list 行號:將顯示當前檔案以「行號」為中心的前後10行**,如:list 12
list 函式名:將顯示「函式名」所在函式的源**,如:list main
list :不帶引數,將接著上一次 list 命令的,輸出下邊的內容。
列印表示式
print 表示式:簡記為 p ,其中「表示式」可以是任何當前正在被測試程式的有效表示式,比如當前正在除錯c語言的程式,那麼「表示式」可以是任何c語言的有效表示式,包括數字,變數甚至是函式呼叫。
print a:將顯示整數 a 的值
print ++a:將把 a 中的值加1,並顯示出來
print name:將顯示字串 name 的值
print gdb_test(22):將以整數22作為引數呼叫 gdb_test() 函式
print gdb_test(a):將以變數 a 作為引數呼叫 gdb_test() 函式
display 表示式:在單步執行時將非常有用,使用display命令設定乙個表示式後,它將在每次單步進行指令後,緊接著輸出被設定的表示式及值。如: display a
watch 表示式:設定乙個監視點,一旦被監視的「表示式」的值改變,gdb將強行終止正在被除錯的程式。如: watch a
whatis :查詢變數或函式
info function: 查詢函式
擴充套件info locals: 顯示當前堆疊頁的所有變數
查詢執行資訊
where/bt :當前執行的堆疊列表;
bt backtrace 顯示當前呼叫堆疊
up/down 改變堆疊顯示的深度
set args 引數:指定執行時的引數
show args:檢視設定好的引數
info program: 來檢視程式的是否在執行,程序號,被暫停的原因。
分割視窗
layout:用於分割視窗,可以一邊檢視**,一邊測試:
layout src:顯示源**視窗
layout asm:顯示反彙編視窗
layout regs:顯示源**/反彙編和cpu暫存器視窗
layout split:顯示源**和反彙編視窗
ctrl + l:重新整理視窗
如果要看php原始碼的最原始c語言結構可以看這裡:
php原始碼探索四 php擴充套件原始碼分析
1 最重要的entry 比如exif裡的 zend module entry exif module entry struct zend module entry 引數 描述 size,zend api,zend debug and zts 通常使用standard module header來填充...
Byte的原始碼探索
非可變類 final class 實現對比介面 comparable 繼承於數字類 numberbyte min value 最小值 byte max value 最大值 classtype 類型別 byte value 初始值 int size bit位數 int bytes 位元組數static...
《探索C 多執行緒》 thread原始碼(二)
分析thread的內部類id 和 命名空間this thread。this thread中有四個函式,分別是 get id yield sleep for sleep until 它們的定義如下 namespace this thread thrd yield inline void sleep u...