函數呼叫和 show_self 上的限制如下:
- 不能呼叫 exec()。
- 不能終止執行緒或程序。
- 不能發出信號。
- 不能呼叫 longjmp(),除非 longjmp() 的目標就在函數內。
- 不能發出 C++ 異常狀況,除非就在函數內處理異常狀況。
- 必須在合理的時間之內終止。這可以透過 DER_DBG_SHOWSELF_TIMEOUT 環境變數來控制。預設值是 10 秒。
- 在多執行緒應用程式中,函數不能假定在什麼執行緒上執行;必須假定程序中的其他所有執行緒都已暫停。尤其:
- 不能依賴其他執行緒,只能假定其他執行緒可能持有所需的資源。尤其,呼叫 pthread_mutex_lock() 可能導致函數懸滯。
- 不是所有 C/C++ 程式庫函數都允許重新進入。 libc.a 中有許多安全執行緒函數(包括記憶體配置及輸入/輸出函數)就不允許重新進入。
這些函數都可以連續重複使用。這些函數使用 pthread_mutex_lock() 來實作連續重複使用性,所以呼叫時較不會導致除錯階段作業懸滯。
- 對於正在除錯的程序的廣域狀態,函數所做的所有變更在函數返回之後仍然持續生效。
- 呼叫 pthread_create() 的後果無法確定。
如果違反其中一項限制,除錯器會試著回復。
然而,無法保證正在除錯的應用程式的狀態不會出現無可挽回的變動。