함수 호출 및 show_self의 제한사항은
다음과 같습니다.
- exec()를 호출할 수 없습니다.
- 스레드 또는 프로세스를 종료할 수 없습니다.
- 신호를 발생시킬 수 없습니다.
- longjmp()의 대상이 함수 내에 있어야 longjmp()를
호출할 수 있습니다.
- 함수 내에서 예외가 처리되지 않는 한 C++ 예외를
발생시킬 수 없습니다.
- 적절한 시간 내에 종료해야 합니다. 이는
DER_DBG_SHOWSELF_TIMEOUT 환경 변수로 제어할 수 있습니다. 기본값은
10초입니다.
- 멀티스레드된 응용프로그램에서 함수는 - 및 해당 함수에서 실행되는
스레드에 대해 가정할 수 없으며 프로세스의 기타 모든 스레드가
일시중단되었다고 가정해야 합니다. 특히 다음과 같은 경우에 이 내용이 적용됩니다.
- 다른 스레드에 의존할 수 없으며 다른 스레드에
필수 자원이 있다고 가정해야 합니다. 특히, pthread_mutex_lock()을 호출하면
함수가 정지될 수 있습니다.
- 일부 C/C++ 라이브러리 함수를 다시 진입할 수 없습니다. 메모리 할당 및 입출력(I/O) 함수를 포함하여
libc.a에 있는 많은 스레드로부터 안전하게 보호되는 함수를
다시 진입할 수 없습니다. 이 함수를 연속적으로 재사용할 수 있습니다. 이러한 함수는
pthread_mutex_lock()을 사용하여 연속적으로 재사용할 수 있도록 하므로
이 함수를 호출하면 디버그 세션이 중지될 가능성이 적습니다.
- 함수로 인한 디버그할 프로세스의 글로벌 상태의 모든 변경 내용은
함수를 리턴한 후에도 계속됩니다.
- pthread_create() 호출의 영향은 정의되지 않았습니다.
- show_self 기능에는 콘솔에 대해 직접 출력되는 호출이 포함됩니다. 이러한 호출에는
printf(), fprintf() 및 cout 클래스가 포함됩니다. 다른 모든
스레드가 일시중단되어 있는 동안 해당 기능을 평가할 때
디버거가 디버기의 한 임의 스레드에 show_self 함수를 실행합니다. 따라서 기타 스레드가 필요한 모든 호출 실행이 실패합니다.
- 단지 출력이 없을 뿐이므로 상대적으로 심각하지 않은 방법으로 콘솔에 대한 출력 호출이 실패합니다.
- 입력/출력 및 메모리 할당 기능을 포함하여 많은 C/C++ 라이브러리 기능이 뮤텍스에 의해 보호되는 재진입되지 않는 코드를 호출해야 하므로
교착 상태가 될 가능성이 약간 있습니다.
- 기능을 호출할 수 없습니다. 또는 exec() -
스레드를 종료할 수 없습니다.
디버거가 이러한 제한사항이 일치하지 않는 함수를 복구하려고
시도합니다. 하지만 디버그될 응용프로그램의 상태가
다시 변경된다고 보장할 수 없습니다.