我打電話從python
腳本(OS的Ubuntu 14.04)一個C++
應用:瞭解像這樣的「雙重釋放或腐敗」的錯誤
import sys, subprocess
run = subprocess.Popen(['app'] + args, stdout = subprocess.PIPE,
stderr = subprocess.PIPE)
stdout, stderr = run.communicate()
if stderr:
sys.stderr.write('Error in app: ' + stderr.decode('utf-8'))
sys.exit(1)
然後我收到以下錯誤消息(儘管該地址是不同的每時間):
*** Error in `/usr/bin/app': double free or corruption (!prev): 0x00007f50eae98070 ***
該應用程序本身是第三方二進制文件,也就是說,我無法訪問源代碼。然而,即使是在暗示存在app
一些錯誤會導致刪除嘗試相同的實體兩次有3個strangenesses的行爲,我無法理解:
- 隨機相當罕見出現的錯誤(約20%全部運行在相同的數據上)。
app
的一些其他用戶也會收到此錯誤;然而,其中一些人從來沒有得到它。 - 它不會被子流程的
stderr
流捕獲(因此sys.exit(1)
未得到執行)。 - 有時我會在括號中看到
top
而不是!prev
。
有人可以解釋我,這些功能是如何起源的,甚至可以給出一個示例C++代碼來重現此行爲?
那麼,很明顯,錯誤是在你沒有發佈的代碼中。雙倍免費意味着你兩次釋放同樣的東西,例如'int * p = new int;刪除p;刪除p;' – Barry
至於*沒有出現在'stderr' *:gcc(並且可能是glibc)[直接打開'/ dev/tty'](http://stackoverflow.com/questions/31301711/how-can- a-unix-program-display-on-screen-even-when-stdout-and-stderr -31302382#31302382)輸出繞過IO重定向的致命錯誤。 – dhke