예외에 대한 C ++ 디스플레이 스택 추적 좋은 방법은 무엇입니까? 엄청난 양의 추가 코드가

예외가 발생하면 스택 추적을 사용자에게보고하는 방법을 원합니다. 가장 좋은 방법은 무엇입니까? 엄청난 양의 추가 코드가 필요합니까?

질문에 대답하려면 :

가능하다면 휴대용으로 만들고 싶습니다. 정보가 팝업되기를 원하므로 오류가 발생하면 사용자가 스택 추적을 복사하여 이메일로 보낼 수 있습니다.



답변

플랫폼에 따라 다릅니다.

GCC에서는 사소한 것이지만 자세한 내용 은 이 게시물 을 참조하십시오.

MSVC 에서는 Windows에 필요한 모든 기본 API 호출을 처리 하는 StackWalker 라이브러리를 사용할 수 있습니다 .

이 기능을 앱에 통합하는 가장 좋은 방법을 찾아야하지만 작성해야하는 코드의 양은 최소화되어야합니다.


답변

앤드류 그랜트의 대답은하지 하지 도움이의 스택 추적을 받고 던지는 throw 문은 자신의 현재 스택 트레이스를 저장하지 않기 때문에, 적어도하지 GCC와 기능을하고, 캐치 처리기에서 스택 추적에 액세스 할 수 없습니다 더 이상은.

GCC를 사용하여이를 해결하는 유일한 방법은 throw 명령 시점에서 스택 추적을 생성하고 예외 객체와 함께 저장하는 것입니다.

물론이 메소드는 예외를 발생시키는 모든 코드가 해당 특정 예외 클래스를 사용해야합니다.

2017 년 7 월 11 일 업데이트 : 유용한 코드를 보려면 cahit beyaz의 답변을 살펴보십시오. http://stacktrace.sourceforge.net을 – 나는 아직 사용하지 않은하지만 약속 보인다.


답변

Boost 1.65 이상을 사용하는 경우 boost :: stacktrace를 사용할 수 있습니다 .

#include <boost/stacktrace.hpp>

// ... somewhere inside the bar(int) function that is called recursively:
std::cout << boost::stacktrace::stacktrace();

답변

유닉스 : 역 추적

맥 : 역 추적

Windows : CaptureBackTrace


답변

C ++ 11에서 사용할 수있는 예외 역 추적을 생성하는 방법에 표준 라이브러리 옵션 (예 : 크로스 플랫폼) 을 추가하고 싶습니다 .

사용 std::nested_exceptionstd::throw_with_nested

이렇게하면 스택이 풀리지 않지만 내 생각으로는 다음으로 가장 좋은 것이 있습니다. 에 유래에 설명되어 있습니다 여기여기에 당신이 할 수있는 방법, 당신의 예외에 역 추적을 얻을 있으며 중첩 된 예외를 다시 던질 적절한 예외 처리기를 작성하여 디버거 또는 번거로운 로깅없이 코드 내부의 .

파생 된 예외 클래스로이 작업을 수행 할 수 있으므로 이러한 역 추적에 많은 정보를 추가 할 수 있습니다! 역 추적이 다음과 같은 GitHub 에서 내 MWE를 살펴볼 수도 있습니다 .

Library API: Exception caught in function 'api_function'
Backtrace:
~/Git/mwe-cpp-exception/src/detail/Library.cpp:17 : library_function failed
~/Git/mwe-cpp-exception/src/detail/Library.cpp:13 : could not open file "nonexistent.txt"

답변

AFAIK libunwind는 이식성이 뛰어나서 지금까지 사용하기 쉬운 것을 찾지 못했습니다.