2012-12-27 31 views
0

我調試崩潰,我看到以下現象 -在/ proc/PID /地圖ESP不同和二進制

當我GDB和進程,做信息登記,我看到ESP以下值 -

ESP 0xfd2475d0 0xfd2475d0

在這樣做的,其中它被崩潰碼的拆卸,我看到以下 -

81c886a:C7 04 24 2C F9 8A 0C MOVL $ 0xc8af92c,(%ESP)

,如果我在/ proc //地圖檢視地圖文件,我看到堆的地址範圍 -

fff39000-fff59000 rwxp 7ffffffde000 00:00 0 [堆]

顯然,在GDB ESP 0xfd2475d0的值與地圖文件中的堆棧地址不同步。

這可能是墜機的原因。我認爲這應該是因爲我得到SIGSEGV。另外,我該如何解決這個問題?

請協助

回答

0

是的,這顯然是一個分段錯誤的理由。因爲英特爾架構支持分配的代碼,數據和堆棧段 - 並且所有內存訪問(使用基址寄存器== ebp或esp)隱式地通過堆棧段,所以不會拋出它是非常不明智的。

由於編譯器將使用不同的基址寄存器(和不同的隱式段寄存器)來讀取任何其他的任意指針,因此這會縮小對堆棧寄存器損壞的搜索範圍。

更罕見的可能性是堆棧粉碎即。在當前函數範圍內訪問除局部變量之外的其他堆棧元素 - 在這種情況下會破壞調用者的堆棧/幀指針。

void foo(int *p) { 
    int a[2]; 
    a[4] = p; 
} 

而更可能的選項是過度分配。

void foo() {  
    double too_big[6000000]; // this would be located at 0xfd...... 
    int a;      // this would be located at 0xfff3f000 ... 
} 
+0

請注意,主流操作系統不使用分段,因此它們不捕獲指定堆棧區域之外的訪問(僅適用通常的內存保護)。如果使用線程或sigaltstack,這很重要,在這種情況下,其他一些內存塊將用作堆棧。 – Jester