2009-12-12 3 views
6

상황은 다음과 같습니다. 스레드 A는 예외를 캐치하고 예외 필터의 GetExceptionInformation을 사용하여 메모리의 어딘가에 예외 데이터를 저장 한 후 스레드 B는 해당 예외 정보를 가져 와서 다시 전달하려고합니다. 하지만 문제는 스레드 B가 catch 된 예외를 rethrows 때 예외로 이어지는 원래 호출 스택이 누락되었습니다.
어떻게 원래 호출 스택을 잃지 않고 예외를 다시 throw 할 수 있습니까? (이 질문은 C++에 관한 것임을 참고하십시오).어떻게 원래 호출 스택을 잃지 않고 예외를 다시 게시합니까?

+0

그냥 예를 들어 C#과 관련된 답변을 얻지 못하도록하고 싶었습니다. –

+1

일부 솔루션은 언어/플랫폼별로 확실합니다. C++ 및 C# 예외는 서로 다르며 C++ 예외는 서로 다른 플랫폼에서 다르게 구현됩니다. –

+0

좋은 솔루션은이 [stack overflow thread]에 설명되어 있습니다. (http://stackoverflow.com/questions/23820633/gdb-prevent-losing-backtrace-in-a-catch-rethrow-situation) –

답변

2

catch 블록에서 스택을 풀어서 재사용중인 예외의 일부로 저장할 수 있습니다. C++에서 스택을 unwinding하는 것은 약간 까다 롭습니다. 그러나 예를 들어 WxWidgets과 함께 제공되는 크래시 덤프 콜렉터 코드를 자세히 살펴볼 수 있습니다.

+0

내 경우에는 완전히 실용적이지는 않지만 대답으로 표시 –

0

질문은 "수신"스레드에 스택을 전달해야하는 이유는 무엇입니까?

기본적으로 일부 오류 로그에보고하기 위해 스택이 필요하다고 가정합니다. 잡기 스레드에서 스택을 걸거나 미니 덤프를 생성하거나 수집 할 오류 정보를 생성 한 다음 예외 사본 (가능한 경우 조각화에주의하십시오)을 수신 스레드로 전달할 수 있습니다.

+0

포크 - 조인 루틴의 일종으로 잡힌 예외. 그래서 예외가 일부 작업자 스레드에서 던져지면 주 스레드로 전달하고 거기에 다시 던지기를 원합니다. (+ 원래 스택을 잃고 싶지 않습니다.) –

관련 문제