2017-05-24 31 views
0

Windows에서 현재 실행중인 C++ 프로그램의 호출 스택을 프로그래밍 방식으로 가져 오는 방법에 대한 예제를 제공 할 수 있습니까? 일부 스레드 (예 : print call stack in C or C++)에서 DbgHelp을 사용하라는 제안을 받았습니다. 그러나 라이브러리는 매우 커 보이고 호출 스택 이외의 많은 기능을 제공하므로 예제없이 라이브러리를 연구하는 데 시간이 오래 걸릴 수 있습니다. 또한 라이브러리는 마지막 버전 (6.12)이 2010 년 2 월 1 일 (현재 7 살)이므로 폐기되었습니다. C++에서 호출 스택을 가져 오는 데 새로운 것이 있습니까?Windows에서 C++ 호출 스택을 얻는 예제

DbgHelp 사용 예를 제공하는 경우 설치 방법, 프로젝트 추가 및 프로그램 제공 방법을 설명 할 수 있습니까?

호출 스택에있는 모든 함수의 꾸며지지 않은 이름을 선호합니다. 매개 변수의 값을 사용하는 것이 좋습니다.

+1

[Boost.Stacktrace] (http://boostorg.github.io/stacktrace/index.html) – genpfault

답변

0

ebp를 호출하여 호출 스택을 트래버스하는 것은 엄청난 작업이 아닙니다. CaptureStackBackTrace (https://msdn.microsoft.com/en-us/library/windows/desktop/bb204633(v=vs.85).aspx)는 직접 수행하지 않으려는 경우이를 수행합니다.

+0

이것은 주소 만 제공하고 기호 (기능 이름)는 제공하지 않는다는 것을 이해합니다. –

+1

프로그램 컴파일 방법에 따라 기호가 실행 파일에 나타나지 않을 수도 있습니다. –

+0

기호를 얻는 것은 사용하고 싶지 않았다고 언급 한 디버그 도움말 라이브러리를 사용하는 것입니다. (https://msdn.microsoft.com/en-us/library/windows/desktop/ms679309(v=vs.85).aspx) 기호는 여러 파일에 위치 할 수 있으며 가져 오는 위치에 따라 달라질 수 있습니다 그들로부터 당신은 가변 품질의 콜 스택 (callstack)을 가질 것입니다. 단지 exe에서 빠져 나오고 싶다면 부분적인 PE 파서 (https://msdn.microsoft.com/en-us/library/ms809762.aspx)를 작성해야합니다. pdb에는 가장 풍부한 심볼 소스가 있지만 직접 파싱하는 것은 좋지 않습니다. –