2012-09-17 40 views
0

我看到了一個很好的方式來從以下文章中獲取符號名稱。如何在追溯時獲取文件名和行號?

Win32 - Backtrace from C code

但有關獲取的文件名和行號是什麼。我試圖使用SymGetLineFromAddr64,但無法獲得此調試信息。

+0

你試過了什麼?您的二進制文件是否包含調試信息? – nneonneo

+0

是的,它使用調試信息構建,當我使用GetLastError函數來獲取最後一個錯誤。我得到0xc0000005。 – Imran

+0

我的意思是...你可以發佈你試過的代碼嗎? [SSCCE](http://sscce.org/)是首選。 – nneonneo

回答

3

如果你不能得到這個調試信息,並且你的代碼是正確的,那麼問題可能與選項有關。你需要SYMOPT_LOAD_LINES有裝載這樣的信息:

SymSetOptions(SYMOPT_LOAD_LINES); 

然後,假設你正在使用從您提供的鏈接代碼,這將是這樣的:

DWORD dwDisplacement; 
IMAGEHLP_LINE64 line; 

SymGetLineFromAddr64(process, (DWORD64)stack[i], &dwDisplacement, &line); 

現在,您可以訪問這些line成員(來自IMAGEHLP_LINE64 structure):

DWORD LineNumber; 
PTSTR FileName; 
+0

謝謝,這實際上解決了我的問題。我將NULL傳遞給了第三個參數,因爲它在SymFromAddr中是可選的,所以我假設這個函數是相同的。 – Imran

+0

有許多API函數,我們有可選參數,但將非空指針傳遞給它們總是安全的。這種參數的另一個函數示例是'CreateThread',其中'threadID'參數是可選的(還有很多其他的參數),有些人只是傳遞'NULL'給它,但其他人傳遞指針。恕我直言,我喜歡總是通過一個有效的指針出於安全原因。當然,如果你很好地瞭解API函數,你可以隨心所欲地做任何事情,但是有疑問的話,可以採用安全的方式。 –

+0

是的,你是對的。它發生在我身上,因爲我只是想節省幾秒鐘,而我可以在最後保存:)而且這兩個函數簽名非常相似(除了最後一個參數),我無法這樣想。 – Imran

相關問題