2013-03-18 47 views
1

我正在處理的代碼有很多調用來創建一個新的字符串和東西..但最近在將服務器升級到12.10 Ubuntu後,我開始面臨一些麻煩。一些子進程卡在futex中。於是我就和連接GDB到正在運行的過程,是在futex很長一段時間,我做了backtrace,發現以下日誌在調用malloc和死鎖程序時出現分段錯誤futex

#0 0x00007f563afc69bb in ??() from /lib/x86_64-linux-gnu/libc.so.6 
#1 0x00007f563af4a221 in ??() from /lib/x86_64-linux-gnu/libc.so.6 
#2 0x00007f563af47fa7 in malloc() from /lib/x86_64-linux-gnu/libc.so.6 
#3 0x00007f563afcfbfa in backtrace_symbols() from /lib/x86_64-linux-gnu/libc.so.6 
#4 0x0000000000446945 in sig_segv (signo=<optimized out>) at FILE THAT HAS THE HANDLER,SIGHANDLER 
#5 <signal handler called> 
#6 0x00007f563aefb425 in raise() from /lib/x86_64-linux-gnu/libc.so.6 
#7 0x00007f563aefeb8b in abort() from /lib/x86_64-linux-gnu/libc.so.6 
#8 0x00007f563af3939e in ??() from /lib/x86_64-linux-gnu/libc.so.6 
#9 0x00007f563af43b96 in ??() from /lib/x86_64-linux-gnu/libc.so.6 
#10 0x00007f563af463e8 in ??() from /lib/x86_64-linux-gnu/libc.so.6 
#11 0x00007f563af47fb5 in malloc() from /lib/x86_64-linux-gnu/libc.so.6 
#12 0x00007f563b7f660d in operator new(unsigned long)() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#13 0x00007f563b8533b9 in std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&)() 
    from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#14 0x00007f563b854d95 in char* std::string::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag)() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#15 0x00007f563b854e73 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#16 0x0000000000412362 in MyString (bs=0x4aabd6 "-", this=0x7fffe854f940) at CONSTRUCTOR FROM C-STRING MyString(const char* bs):std::string(bs) {}; 
#17 A FUNCTION THAT CALLS THE ABOVE LINE 

我很困惑。我檢查了內存,並且PC擁有將近20GB的可用內存。那麼函數在malloc中崩潰的機會是多少?我得到它爲什麼卡在futex,但爲什麼malloc? 我真的很想得到這個解釋。

的崩潰發生這種類似被調用後:

MyString(const char* bs):std::string(bs) {}; 

此行被稱爲一個簡單的C字符串轉換成C++類型的std :: string。但這個班是我自己的班。由於主要有兩個原因,我無法在這裏給出整個代碼。 1)代碼由我的公司擁有。 2)它該死的長。

我真的很抱歉。我只需要解釋爲什麼它會在malloc中崩潰,並因此導致死鎖,因爲sighandler也要求malloc,並且它等待上一個鎖釋放,而不是。

+2

郵政編碼請 – 2013-03-18 12:58:31

+0

只需使用'valgrind'!它會指向導致段錯誤的確切代碼行。 – Dariusz 2013-03-18 13:17:39

回答

1

看起來你可能會在信號處理程序中調用malloc()(間接地通過backtrace_symbols()),不要。

malloc()不是異步信號安全。在信號處理程序中調用它,而其他代碼在malloc()中時可能會使您陷入死鎖(就像它在此處那樣)。

使用backtrace_symbols_fd()相反,它不會叫malloc()

+0

謝謝,這將解決僵局..但是如何發生崩潰? – 2013-03-18 13:07:19

+0

@PrasanthMadhavan:由於代碼中的錯誤而發生崩潰。 (考慮到您發佈的上下文數量,我們還能說些什麼?) – 2013-03-18 13:10:40

+0

猜測,您可能會在某處損壞堆。您可以使用valgrind來查找問題。您也可以嘗試將環境變量'MALLOC_CHECK_'設置爲'3',這可能會使它更早地「中止()」,可能更接近腐敗點。 – Hasturkun 2013-03-18 13:11:03

1

由字符串指向的內存可能損壞/釋放等。

這個問題可能是以前有,現在得到了體現,因爲變化在編譯器/其他庫中。

用valgrind運行你的代碼來調試內存損壞問題。