2017-05-24 210 views
0

有人可以舉例說明如何以編程方式獲取Windows上當前運行的C++程序的調用堆棧嗎? 來自某些主題(例如print call stack in C or C++)我有一個建議使用DbgHelp。然而,這個庫看起來相當龐大,並且打算用於更多的功能而不僅僅是調用堆棧,因此在沒有示例的情況下學習庫可能需要很長時間。 此外,該庫似乎已過時,因爲它的最後一個版本6.12的日期爲2010年2月1日(截至目前爲止,已有7年)。現在有沒有什麼新的獲取C++的調用堆棧?在Windows上獲取C++調用堆棧的示例

如果您給出了DbgHelp用法的示例,您是否還可以描述如何安裝它,添加到項目中並隨附我的程序?

我想在調用堆棧中獲得所有函數的未裝飾名稱,最好使用參數的值。

+1

[Boost.Stacktrace](http://boostorg.github.io/stacktrace/index.html) – genpfault

回答

0

通過彈出ebp來自動遍歷調用堆棧的工作量並不是很大,CaptureStackBackTrace(https://msdn.microsoft.com/en-us/library/windows/desktop/bb204633(v=vs.85).aspx)會爲您做到這一點,如果您不想自己做。

+0

據我所知,這隻會給出地址,而不是符號(函數名稱)。 –

+1

根據程序編譯的方式,這些符號甚至可能不在可執行文件中。 –

+0

獲取符號是您提到的不想使用的調試幫助庫的簡介。 (https://msdn.microsoft.com/en-us/library/windows/desktop/ms679309(v=vs.85).aspx) 這些符號可以位於許多文件中,並取決於您從哪裏獲得他們從你那裏將有一個可變的質量調用堆棧。如果你只是想讓他們脫離一個exe文件,你將不得不編寫部分PE解析器 - https://msdn.microsoft.com/en-us/library/ms809762.aspx。 pdb具有最豐富的符號來源,但我不會推薦自己解析它們。 –