문제

Native C++ 애플리케이션에서 런타임에 호출 스택에 액세스하고 싶습니다.저는 IDE를 사용하고 있지 않습니다.호출 스택을 어떻게 표시합니까?

업데이트:응용 프로그램 전체의 여러 지점에서 호출되는 함수가 있습니다.드물게 충돌이 발생합니다.발신자의 이름을 알아내고 기록할 수 있는 방법을 찾고 있었습니다.

도움이 되었습니까?

해결책

나는 그것을 믿는다 이것 페이지에는 귀하가 찾고있는 답변이 있습니다. 당신은 시각적 C를 말했습니다. 그래서 나는 당신이 창을 의미한다고 가정합니다.

다른 팁

살펴보십시오 Stackwalk64.

.NET 에서이 작업을 수행하는 데 익숙하다면 불쾌한 놀라움을 느끼고 있습니다.

설정을 고려해야 합니다. 처리되지 않은 예외 필터 그 안에서 미니덤프 파일을 작성합니다.그다지 복잡하지도 않고, 잘 기록 된.처리되지 않은 예외 필터에서 한 번 수행한 최소한의 작업만 고수하세요. 모두 잘못됐어 창의력을 발휘한다면).

그러나 안전한 측면을 유지하려면(처리되지 않은 예외 필터가 실수로 덮어쓰여질 수 있음) 코드를 __try/__out 블록 안에 넣고 필터 함수 내에서 미니덤프를 작성할 수 있습니다. __try/__out 블록이 있는 함수가 있는 경우 별도의 함수에 넣는 것을 고려하세요):

긴 __stdcall myfilter(EXCEPTION_POINTERS *pjack_info)
{
mycreateminidump(pbook_info);
EXCEPTION_EXECUTE_HANDLER를 반환합니다.
}
무효 myfunc()
{
__노력하다{
//여기에 논리가 있습니다
} __just(myfilter(GetExceptionInformation())) {
// 예외 처리됨
}
}

그런 다음 선택한 디버거를 사용하여 덤프 파일을 검사할 수 있습니다.Visual Studio와 Windows 디버깅 도구 패키지의 디버거는 모두 미니덤프를 처리할 수 있습니다.

충돌의 콜 스택을 받고 싶다면 정말로하고 싶은 것은 MORTEM 디버깅 후. 실행 중에 응용 프로그램의 콜 스택을 확인하려면 많은 기능 중 하나입니다. Sysinternals 프로세스 탐색기 제공 할 수 있습니다.

적극적으로 디버깅하지 않으면 앱을 "충돌"하여 미니 덤프를 생성 할 수 있습니다 (이것은 비 침습적으로 수행 할 수 있으며 앱이 계속 실행될 수 있음). IIRC DRWATSON은 MS 지원의 사용자도가 아닌 경우이 작업을 수행 할 수 있습니다.

그런 다음 덤프를 WindBG에로드하고 CallStack + 변수 등을 볼 수 있습니다. 추적을 이해하려면 앱의 기호가 필요합니다.

더 간단한 런타임 코드 스타일 추적을 찾고 있다면 모든 방법에서 인스턴스화하는 간단한 클래스를 권장하는 것이 좋습니다. 생성자는 outputdebugstring을 사용하여 메소드 이름을 작성합니다. Windebug를 사용하여 프로그램이 실행될 때 추적을보십시오. (글로벌 변수 또는 레지스트리 값 또는 글로벌 원자에도 불구하고 클래스에 어떤 형태의 제어를 배치하여 추적을 마음대로 켜거나 끌 수 있습니다).

드문 경우에 충돌합니다. 나는 발신자의 이름을 얻고 로그인하는 방법을 찾고있었습니다.

충돌이란 무엇을 의미합니까? 액세스 위반? 0으로 나눕니다. 정확히 무엇? 커널 모드 구성 요소와 상호 작용합니까?

Appverifier를 켜십시오. 그것은 많은 것을 제거해야합니다.

이것을 만드십시오 :

hkey_local_machine 소프트웨어 microsoft Windows nt currentVersion 이미지 파일 실행 옵션 filename.exe

이 키 아래에서 새 문자열 이름을 만듭니다 : 디버거 값 : c : pathtowindbg windbg.exe -xe av

WOW로 32 비트 코드를 실행하는 경우 WOW3264Node에서이를 수행해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top