題:
如何在gdb中獲取當前的PHP函數名稱?
kenorb
2015-08-05 16:26:08 UTC
view on stackexchange narkive permalink

我正在按照以下步驟來查找當前的PHP函數調用:

  1. 運行虛擬腳本:

      $ gdb -ex run --args php -r“ sleep(10);”  
  2. 按下 Ctrl + C kbd>回到 gdb 來運行:

     (gdb)bt full#1 0x00007ffff6007dd4在__sleep(seconds = 0)中,位於../sysdeps/unix/sysv/ linux / sleep.c:137 ts = {tv_sec = 8,tv_nsec = 306649388} set = {__val = {65536,0 <repeats 15 times>}} oset = {__val = {0,4469319,4294967295,8081486,140737319884960,140737354 15761488、15454080、15337134、140737354001040、0、7307048、16048064、206158430232、140737488342304、140737488342096}}結果= <optimed out>#2 0x00000000006156ef in zif_sleep()無符號表信息可用(ddd000000_in_trace_0000)沒有符號表信息可用(#3 0x000000)-dd000000_in_execute_internal沒有符號表信息可用。 #4 0x000000000079dde5 in ?? ()沒有可用的符號表信息。#5 0x0000000000717b18在execute_ex()沒有可用的符號表信息。#6 0x00000000006ddc79在dtrace_execute_ex中()沒有可用的符號表信息。#7 0x00000000006e1b0a在zend_eval_stringl中的()沒有可用的符號表信息。#8 0x00000000006b在zend_eval_stringl_ex()...(gdb)框架2#2中0x00000000006156ef在zif_sleep()(gdb)打印(char *)(executor_globals.function_state_ptr->function)->common.function_name嘗試提取一個值的組成部分。 (gdb)print(char *)(executor_globals.function_state_ptr->function)嘗試提取非結構值的組件。(gdb)print(char *)(executor_globals)$ 2 = 0xffffffffffffffcfcf48 <錯誤:無法訪問地址的內存0xffffffffffffcf48>  

    因此,似乎 executor_globals 符號不可用。是因為二進製文件已優化,還是我的框架錯誤或其他原因?或者我應該改用 lldb

  3. ol>
如果該符號不可用,則會收到有關未知符號的其他錯誤消息。 (嘗試`print(char *)(blarflgrumpf)`)。看來您的二進製文件已經在優化的基礎上進行了編譯(這可能會將一些變量放入寄存器中,而不會使gdb知道並依賴(錯誤的)堆棧值)。嘗試用-O0和-g編譯/鏈接`php`。另外,除非您削減回溯的某些部分,否則堆棧可能會損壞,因為似乎已經憑空調用了“ execute_ex”。堆棧破裂可能是各種意外行為的原因。
@GuntramBlohm謝謝,是的,bt中有更多幀(使用??最多#10),我已經重新添加了。是的,未知符號正在打印不同的消息。這就是說,如果不重新編譯PHP,就無法訪問/提取有關當前函數的數據?
好吧,有些事情對我來說似乎有些混亂:指令告訴您將框架移至最後一個“執行”調用,而您只有“ execute_ex”;如果`executor_globals`確實是一個全局變量,則堆棧框架無關緊要,但是如果它是局部的,則不應在`zif_sleep`框架中找到它。我想知道您鏈接到該網站的最新信息。但是由於`executor_globals`的值是錯誤的,並且您的PHP站點顯示“重要!要獲得正確信息的回溯,您必須使用--enable-debug!配置PHP”,我認為您需要重新編譯。
高度相關的https://stackoverflow.com/a/31240030/308851
一 回答:
Moshe
2016-11-30 07:38:02 UTC
view on stackexchange narkive permalink

根據此鏈接,應該可以通過以下步驟找到正在使用的函數:

  1. 將gdb附加到當前正在運行的PHP進程中: gdb -p <processid>
  2. 加載適用於您的PHP版本的PHP .gdbinit 文件(可從此處獲得)
  3. 使用 zbacktrace 命令顯示當前正在運行的PHP腳本
  4. ol>

    例如:

      gdb -p 4584(gdb)源PHP_5_5 / .gdbinit(gdb)zbacktrace [0xec906090] addOne()/tmp/yourscript.php:9 
太棒了! 2.中指向.gdbinit文件的鏈接很有幫助!謝謝!
該鏈接對我安裝`php5-cli-dbgsym` https://wiki.ubuntu.com/DebuggingProgramCrash也是有用的


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...