2012-01-04 46 views
-6

我有幾個問題:Backtrace如何在Linux x86_64上運行?

  1. int backtrace(void ** buffer,int size); 這裏緩衝區是指針數組。並且返回數組元素返回指向堆棧的每一幀。那麼,backtrace()在內部調用malloc()的次數與幀數一樣嗎?爲什麼這是爲了?
  2. 上面分配的內存沒有從backtrace()中釋放(),那麼誰釋放這個內存呢?
  3. 是否有任何方法,以避免從backtrace()內的malloc()?
  4. 哪裏可以找到backtrace()源代碼?
  5. 我該如何編寫代碼來回溯到程序集?
+3

-1:我2008-06-14手冊頁(或更早版本太)回答您的問題1和2明確。第2段的說明:「並且必須由呼叫者釋放」。 – thiton 2012-01-04 09:52:45

+0

可否請讓我知道如何以及在哪裏找到「我的2008-06-14聯機幫助」? – sandeep 2012-01-04 10:32:17

+2

在任何Linux系統上的shell(在終端中)運行'man backtrace'。手冊頁是所有系統和核心C庫函數的權威信息源。 – thiton 2012-01-04 12:14:44

回答

4

請仔細閱讀manual page回溯一下。你似乎弄錯的一些基本情況:

  1. 沒有,array緩衝區指針,其填充在由backtrace()在棧幀指向。沒有致電malloc()
  2. 你,因爲這是你的記憶。
  3. 不適用,backtrace()不會撥打malloc()
  4. 它是GNU libc的一部分。 Here是實現的一部分。
  5. 大概是通過複製堆棧指針並手動走棧。

您似乎混淆backtrace()backtrace_symbols(),後者涉及內存分配。

要讀出當前的回溯最多64級的,只是做:

void *stack[64]; 
const int depth = backtrace(stack, sizeof stack/sizeof *stack); 
+0

@backtrace()不會調用malloc ()。 - 在backtrace調用之前我已經爲malloc()添加了一個鉤子,並且當我調用了backtrace()時,調用了malloc的鉤子。並且回溯未能重新堆疊。但是當我從我的HOok函數中專門調用malloc並從它返回分配的內存時,回溯是Successfull ..再次,當我添加了免費的鉤子時,它沒有被調用..它導致我得出上述結論。當我閱讀文檔時,我還假設你爲自己,現在自己驗證它.. – sandeep 2012-01-04 10:24:54