2013-04-08 76 views
0

我有一個奇怪的問題,以略低修改MobileC構建工作時。段錯誤使用C宏

我在宏中遇到了段錯誤,但是當我在代碼中加入printfs(因爲它是C層的,所以不可能調試)我無法得到它發生的確切位置。

這是代碼:

... 
printf("just to check there is no problem accessing "node" %d\n", node);\ 
printf("this will be printed\n"); \ 
node_type##_Destroy(node); \ 
printf("this will not be printed\n"); \ 
... 

和銷燬的代碼如下:

int name##_Destroy(name##_p name) \ 
{ \ 
printf("this will not be printed\n"); \ 
... 

我尚未修改代碼的這一部分(除了printfs輸出),以便我想沒關係。你有什麼想法可以在這裏發生?

+0

當您使用附加的調試器完成代​​碼時會發生什麼?段錯誤發生在哪條線上? – SecurityMatt 2013-04-08 16:11:37

+0

問題是它解釋了C,所以我無法調試它... – user1031431 2013-04-08 16:14:13

回答

0

謝謝您的解答。現在我知道發生了什麼事。

迪特里希EPP,確實節點不是一個INT(我只是想知道是否有訪問它,因爲我被錯誤搞砸了,並沒有關於發生了什麼事的線索問題)。 謝謝你警告我關於C宏。我有read一點點,最後我已經知道發生了什麼。

NODE_TYPE類型是。因此宏擴展到agent_Destroy(節點)。問題是在Mobile C代碼中存在一個名爲agent_Destroy(agent_p agent)的函數。 發生了什麼事情是兩個函數都執行了,第一個函數是直接在代碼中出現了分段錯誤的地方。

0

段錯誤的刪除幾乎總是指向一個已損壞的堆。有些東西已經拋棄了你的指針所在的堆(或者它正在跟蹤上一個/下一個指針的地方)並導致跳轉到超空間。託管代碼使這種可能性降低,但它仍然是我開始的地方。

3

有這兩個代碼紅旗,但是你還沒有真正顯示我們足夠。

printf("just to check there is no problem accessing "node" %d\n", node);\ 
printf("this will be printed\n"); \ 
node_type##_Destroy(node); \ 
printf("this will not be printed\n"); \ 

這顯然是一個宏,但它是一個多語句宏。這是宏搞砸了最簡單的方法,因爲它可以被稱爲是這樣的:

#define MACRO() puts("A"); puts("B") 
// prints "B" 
if (0) MACRO(); 

其次,該字符串常量十分可疑:

"just to check there is no problem accessing "node" %d\n", node 

注意如何node是據稱的int,但它出現在沒有編譯錯誤的兩個字符串常量之間。一個int不應該是能夠做到這一點,所以node可能不是十分的int。這可能是一個完整的表達,誰知道?