我正在通過gdb運行程序。它運行「free(buffer)」;「那麼我得到這個消息: 程序收到信號SIGSEGV,分段錯誤。什麼是「ar_ptr = arena_for_chunk(p);」意思?
0xb7e97103 in __GI___libc_free (mem=0xbffff11e) at malloc.c:2987
2987 ar_ptr = arena_for_chunk(p);
程序中的下一行是「fclose(inptr);」我該如何開始解決這個問題?
我正在通過gdb運行程序。它運行「free(buffer)」;「那麼我得到這個消息: 程序收到信號SIGSEGV,分段錯誤。什麼是「ar_ptr = arena_for_chunk(p);」意思?
0xb7e97103 in __GI___libc_free (mem=0xbffff11e) at malloc.c:2987
2987 ar_ptr = arena_for_chunk(p);
程序中的下一行是「fclose(inptr);」我該如何開始解決這個問題?
你的問題的實際答案是ar_ptr = arena_for_chunk(p);
是一個內部數據結構,它決定了內存應該釋放到哪裏。然而,如果你喜歡,你可以繼續挖掘,直到你發現爲什麼p
幾乎可以肯定是你傳入的buffer
或者與它密切相關的某個值是「不正確的」 - 但是這有點像在尋找你丟棄的密鑰街燈,因爲你可以在那裏看到更好的,而不是試圖找到他們放在他們的地方。
當標準庫中的代碼崩潰時,特別是每次運行任何不重要的程序時調用的代碼,那麼它由「壞的輸入」引起的時間爲99.9% - 請查看調用該函數的代碼,而不是內部該函數(儘管值得回顧一下哪些錯誤來確定導致問題的哪個輸入參數)。
實際的問題是,你的代碼調用free()
一個壞的參數,這使得arena_for_chunk
要做錯事 - 給定的值mem = 0xbffff11e
在上面的線,我想到的是buffer
實際上是在棧上的值,這不應該被釋放。
這兩個答案中的任何一個對你有幫助嗎?如果是這樣,接受其中一個(點擊勾號)並且提高它(點擊向上的三角形)將是有建設性的。如果他們都幫助,upvote和剔最有用的一個。如果沒有幫助,解釋爲什麼,我相信你會得到更多的幫助...... – 2013-03-11 19:58:35