2017-05-31 50 views
-2

我在linux內核中得到一個NULL指針解引用問題。在PC上使用addr2line我可以在代碼中獲得行號。但是這個oops發生的行是一個雙指針解引用。內核在雙指針解引用哎呀

eg. xx->yy->zz 

這裏我們將xx和xx-> yy在一行中解除引用。

addr2line -f -e vmlinux c03200f8 
func 
lmn/uva/hello.c:101 

101: if(xx->yy->zz==hello) 

那麼如何知道哪個字段是NULL xx或xx-> yy?

+1

_尋求調試幫助的問題(爲什麼這個代碼不工作?)必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現問題所需的最短代碼。沒有明確問題陳述的問題對其他讀者無益。請參閱:如何創建[mcve] ._ –

+0

請至少顯示您的調試/調試工作。請先閱讀[問]頁面。 –

+0

您在取消引用指針之前檢查它*嗎?就像'if(xx!= NULL){...}'? –

回答

0

一般情況下,爲了避免TESE型空指針引用,我們使用的樣式

if (xx && xx->yy) 

的地方,如果xx不爲NULL提領時才計算。

根據短路運算符屬性,在這種情況下,邏輯與,僅在LHS評估爲TRUE時評估RHS操作數。因此,對於上述示例,

  • xx爲NULL時,禁止引用。
  • xx不爲NULL時,解除引用發生。

那麼如何知道哪些字段爲NULL XX XX-或> YY

分解操作,把調試打印,如果你想知道NULL,兩者均再次運行的指針。這是一個通用的建議。

+0

我不認爲這個評論是正確的。拍一個空檢查是一個典型的錯誤的事情 - 大多數情況下,錯誤是指針爲空。分解表達式的建議有時可以使用,但如果崩潰不容易重現,則無用,也沒有提供進一步的提示。 –

+0

@employeeofthemonth'拍一張空檢查是一個典型的錯誤的事情'照顧詳細說明? 「大多數情況下,這個錯誤就是指針在第一位爲空。」這就是檢查的目的。 –

+0

親愛的@downvoter,謹慎解釋? –

2

在內核源代碼樹中有腳本/解碼器。一旦你餵食它,你就會看到圍繞着崩潰指令的可讀組件。

你將不得不分析它是如何適合源代碼樹的。對於任何進行內核編程的人來說,這是一項強制性技能,而且大部分時間並不難。一個簡單的捷徑是檢查解除引用字段的偏移量,並查看它與崩潰地址的關係。

+0

是的,你是對的,我拆卸vmlinux並使用PC去碰撞的位置。並在分析彙編代碼後,我能夠找到NULL的確切指針。感謝幫助 – Saturn