2013-04-25 26 views
0

我有一個程序,它在一個特定的線段錯誤:段錯誤發生時,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中,我驗證了地址是可訪問的。

+0

上下文中的一些代碼可以幫助我們。 – akluth 2013-04-25 14:47:45

+0

請詳細說明small_base和索引類型。 – Nikolai 2013-04-25 14:49:31

回答

1

我不知道你如何使用find_difference()函數和傳遞給函數的參數值,但我懷疑你的指針算術是錯誤的。

您正在將large_base和smaller_base遞增1並將結果地址轉換爲u64 *。 如果大小是以字節爲單位,那麼你應該檢查large_base + index + 8的大小。

+0

大小是以字節爲單位的緩衝區的大小。我認爲您的評論與我的第二次修改的問題類似,並且是正確的。索引將使用超過緩衝區末尾8個字節的index = size-1。我會覈實並回復。 Bah,它非常簡單,謝謝你的額外眼睛。 – user2320249 2013-04-25 19:31:21

+0

證實我的指針數學被搞砸了會檢查右手邊界。 – user2320249 2013-04-25 19:57:37

0

你原來的指針運算添加指數(無符號字符*)它是一個地址鑄造uint64_t中導致未對齊的內存負載,即試圖取消引用一個(uint64_t中*)前不是8的倍數。這可以在調試器中工作,但會在程序中產生SEGFAULT。

相關問題