2015-10-12 79 views
1

我試圖使用libdwarf來計算正在運行的程序中局部變量的位置。我曾經可以通過執行DW_OP_fbreg來完成這項工作,DW_OP_fbreg最終會映射到一個寄存器,該寄存器可能是該函數的基本框架。在較新的矮人標準中,框架基礎是DW_OP_call_frame_cfa。我似乎無法找到任何信息告訴我如何執行DW_OP_call_frame_cfa並返回一個幀基地址。有很多CFA表的參考資料,誰恢復了哪些註冊表,但我不知道如何獲取這些信息以及如何應用它。有人可以填補空白嗎?我該怎麼處理DW_OP_call_frame_cfa

回答

1

DW_OP_call_frame_cfa意味着您必須使用呼叫幀信息來計算CFA;然後將其推入表達式堆棧。

請參閱DWARF 4標準的第6.4節(「呼叫幀信息」)以獲得解釋。基本上,您現在必須閱讀.debug_frame部分,並根據6.4中描述的規則對其進行解碼。這相當於爲另一個小字節碼語言編寫另一個解釋器;並可能重用DWARF表達式解釋器。

該操作碼基本上是DWARF中的空間優化。編譯器已經發出了調用幀信息,並且這個操作碼可以讓它們重新使用它來計算可變位置。

+0

好的,這是有道理的原則。你能告訴我什麼函數獲得指令列表嗎?我們有dwarf_loclist_n()等位置表達式,但我似乎無法找到CFA的等價物。它是否使用相同的DW_OP *操作常量? –

+0

恐怕我不知道libdwarf API,所以我不能在那裏提出任何建議。無論如何,不​​,它不使用DW_OP_ *操作,除非CFA引用DWARF表達式(在某些情況下可以)。 –

+0

@TomTromey什麼是「在表達式棧上推它」的含義? – stackoverflowwww