我給自己定的退出和_exit和我的程序斷點(多線程應用程序,在Linux上2.6.16.46-0.12 SLES10運行),在某種程度上是一種方式還是離開我找不到設置gdb退出斷點不起作用?
(gdb) c ... [New Thread 47513671297344 (LWP 15279)] [New Thread 47513667103040 (LWP 15280)] [New Thread 47513662908736 (LWP 15281)] Program exited with code 0177. (gdb)
出口函數駐留在libc中,因此不存在延遲加載共享庫問題。任何人都知道一些其他不可捉摸的神祕的退出觸發器?
編輯:問題現在只是學術。我嘗試了二進制搜索調試,取消了我的更改的一個子集(問題消失了)。在我再次依次應用它們之後,即使事物恢復到原始狀態,我也不能再重現問題。
編輯2:我發現最近有這種錯誤的原因之一,這可能是這個問題的原始來源。由於歷史原因,我們的產品使用邪惡的鏈接器標誌-Bsymbolic。其中一個副作用是當一個符號未定義但被調用時,GLIBC運行時鏈接程序將以這種方式進行彈出,並且您將在調試程序中看到它作爲0177退出的進程。當運行時鏈接程序以這種方式中止時,假設它使系統調用直接退出(而不是使用C運行時庫exit()或_exit())。這與我無法用調試器中的退出斷點捕捉到這一事實是一致的。
我會嘗試構建gdb 7並查看它顯示的內容。在*給出了同樣的指令地址:
(看起來像一個相當標準的系統調用)。 我想我至少已經隔離了導致這個神祕退出的代碼改變,只是不明白細節。 – 2009-11-23 04:05:35最好使用'catch syscall exit'和'catch syscall exit_group'而不是數值。例如,在我的系統中,'exit'是'[1]'不''[60]'。 – Ruslan 2014-05-24 07:23:47
此外,您可以使用'catch syscall exit exit_group'設置兩者。事實上,現在編輯它... – 2015-06-10 17:51:19