我有一個程序,它在一個特定的線段錯誤:段錯誤發生時,GDB打破上線,但段錯誤後運行線示出沒有違反
uint64_t中smaller_num = *(uint64_t中*)(smaller_base +指數);
GDB成功捕獲段錯誤,允許我調試問題。但是,如果我請從GDB提示行,沒有內存訪問衝突發生:
(GDB)p smaller_num = *(uint64_t中*)(smaller_base +指數)
任何人都可以提供關於如何一些建議,調試這個問題?由於我確認了位於small_base + index處的內存存在,因此我失去了文字和想法。它可以是鑄造的東西嗎?
在此先感謝。
編輯:提供更多的代碼,但它確實很簡單。我大量編輯了代碼以顯示索引的重點。
uint64_t ** find_difference(unsigned char * larger_base,
uint64_t size,
unsigned char * smaller_base,
uint64_t tmap_size)
{
uint64_t len = size < tmap_size?size:tmap_size;
uint64_t index=0;
while(index<len)
{
uint64_t larger_num = *(uint64_t*)(larger_base+index);
uint64_t smaller_num = *(uint64_t*)(smaller_base+index);
if(larger_num > smaller_num)
{
... do stuff
}
index++;
}
...
}
編輯#2:現在我正在考慮這個問題,指針解引用超出len是否可行?這是我的理解,x86號碼存儲從高地址到低地址。因此,在內存中,數字0x01020304被存儲爲0x04 0x03 0x02 0x01。它是否正確?如果這不是真的,那麼尊重將超出緩衝區的末端。但是,在GDB中,我驗證了地址是可訪問的。
上下文中的一些代碼可以幫助我們。 – akluth 2013-04-25 14:47:45
請詳細說明small_base和索引類型。 – Nikolai 2013-04-25 14:49:31