2015-06-20 118 views

回答

2

什麼是分段錯誤的在下面一行的可能原因是什麼?

線路本身極不可能導致分段錯誤。可能發生的唯一方法是如果你已經用盡堆棧。做(gdb) x/i $pc。崩潰指令是PUSH還是CALL?如果是這樣,堆棧耗盡可能是原因。

如果代碼是通過優化編譯的,並且崩潰指令是MOVDQA或類似錯誤,那麼棧錯誤對齊可能是由於:堆棧中的某些代碼沒有按照16字節邊界對齊堆棧目前的ABI。你是否鏈接了一些非常古老的歸檔庫?您是否使用-mpreferred-stack-boundary=21構建了一些代碼?餿主意!

如果(更容易)的崩潰不會真的發生在該行,而是從稱爲該行一些代碼,特別是如果被調用代碼裏面malloc,那麼以前的堆腐敗最有可能的原因。

要找到它,請使用Valgrind或Address Sanitizer。

+0

@Dani馬上指出,問題是以前的堆腐敗。 – dPol