今天寫了個多線程訪問資料庫的程式,一直啟動並執行好好的,突然就出現了下面的問題:
ORA-24550: signal received: [si_signo=11] [si_errno=0] [si_code=1] [si_int=0] [si_ptr=(nil)] [si_addr=0x1]
Killed
我寫了兩個線程,第一個訪問資料庫都成功,但當第二個線程執行到資料庫操作時,就突然出現了上面這麼個玩意。
印象中以前也遇到過,但現在忘瞭解決方法了。
想了會,怎麼會出現這情況,我又沒有改程式,只是加了幾行日誌。
於是從網上尋找答案。。。很多苦逼的同學和我一樣都在尋找協助,但都沒有大神給出準確的答案。
有一個版本的解決方案是這樣的(黃色部分):
ORA-24550:Signal Received Error的解決方案
有同事,用C++ SOCI開發對Oracle資料庫進行DML操作時,發生該錯誤。
在網上查一下資料,都是說在伺服器的sqlnet.ora檔案中加入如下內容。
DIAG_ADR_ENABLED=OFF
DIAG_SIGHANDLER_ENABLED=FALSE
DIAG_DDE_ENABLED=FALSE
但是實際上發現問題還是處理不了。但是把該檔案放到用戶端(應用程式根目錄),該問題就解決了。
但是直覺告訴我,我的這個問題肯定不是這個原因,如果是這個原因的話,那別的訪問資料庫的程式又可以跑的好好的。
於是繼續從網上尋找大神,還是無果。
最後只能靠自己了。
還好我用的那編輯工具可以有後援動作,先回到不加日誌的那個點,編譯運行,這個問題就沒有了。
所以斷定,這肯定和我打的那些日誌有關。於是一行日誌一行日誌檢查,終於找出了有問題的地方。
LOG((char *)"INFO","%s",m_index, "\n\n\n" );
這一行日誌打錯了,應該是: LOG((char *)"INFO","%d: %s",m_index, "\n\n\n" );
再刪除添加這行日誌試了下,果然是這個日誌導致了那個錯誤出現。
這個日誌的底層是sprintf 和一個變參函數。我在用由這些函數封裝的函數時,用錯了。但是編譯沒有報錯,運行時,沒運行到這個地方也沒有出錯。
總結一下,這樣的問題,看上去我們就會想到是oracle資料庫的錯誤資訊,但有時候不是,我這個就只是其他的語句的錯誤,估計是執行的時候記憶體方面問題
所以說,你們出現這個問題,不要盲目去只想是資料庫的操作問題。多看看自己的其他代碼是否有問題。
ORA-01172、ORA-01151錯誤處理
ORA-00600 [2662]錯誤解決
ORA-01078 和 LRM-00109 報錯解決方案
ORA-00471 處理方法筆記
ORA-00314,redolog 損壞,或丟失處理方法
ORA-00257 歸檔日誌過大導致無法儲存的解決辦法