2010-01-12 8 views
4

디버깅해야하는 C++ DLL이 있습니다. DLL을 사용하는 상황 때문에 호출 응용 프로그램을 통해 디버깅 할 수 없습니다.C++ 예외 정보 검색

그래서 catch가 파일에 예외를 기록하는 try-catch를 만들었습니다.

디버깅해야하는 줄에는 제 3 자 dll에서 가져온 클래스가 포함되어 있으므로 어떤 예외 유형인지 알 길이 없습니다. catch (예외 e)를 시도하면 파일에 메시지가 기록되지 않습니다. 그래서 나는 catch (...)를 시도했는데, 뭔가를 방아쇠했습니다.

std :: exception :: what을 사용하면 파일에 기록 된 것은 "1"뿐입니다. std :: exception :: exception을 사용하여 파일에 "0579EF90"코드가 수신되었습니다.

던져진 예외에 대한 의미있는 정보를 검색 할 수있는 방법이 있습니까? TIA

CG

+0

운영 체제? –

+0

이 DLL을 사용하기 위해 얻은 라이선스를 검토하여 라이선스 권리를 행사하는 데 도움이 될 수있는 지원의 종류를 확인하십시오. 그러한 라이센스가 없다면 라이센스를 받아야합니다. –

+0

운영 체제 - Windows XP IDE - Visual Studio 2005 – user228058

답변

7

당신이 catch(KnownExceptionType ex)를 사용하여 정보를 추출하는 KnownExceptionType에 대해 knwoledge를 사용하지 않는 경우, 아니 당신은 할 수 없습니다.

catch(...)을 잡을 때 예외를 처리했지만 거기에 유형 정보가 없으므로 사용자가 할 수있는 일이 거의 없습니다.

라이브러리에서 예외가 발생하는 경우 라이브러리에 대한 헤더가 있어도 해당 예외 유형을 정의 할 필요가 없다는 예외는 없습니다.

+0

감사합니다. 현재 나에게 대안이 있으십니까? – user228058

+0

캐치 (...) 지점 +1. 그것은 끔찍한 생각입니다. –

+0

catch 지점에서 예외를 추출 할 수있는 정보는 잊어 버리십시오. 예외가 트리거되기 전에 디버거를 사용하여 문제를 찾을 수 있습니다. –

3

어쩌면 & 전자에게 표준 : : 예외를

  1. 표준 : : cout을 < < e.what() < < ENDL을 잡기 시도; 당신이 :: 수 std logic_error 및 표준 : : runtime_error을 캐스팅 할 수있는 경우
  2. 볼 - 그건 당신이, 당신이해야 항상 캐치 예외 CONST에 의해 첫째
1

무엇을 다루고 있는지 몇 가지 단서를 제공해야합니다 즉 참조 :

catch(const std::exception & ex) { 
    ... 
} 

그렇게하지

은 예외 당신이 잡을 정확한 유형이 될 것입니다 및이 예외 정보의 손실이 발생할 수 있음을 의미합니다.

그러나 라이브러리가 std :: exception에서 파생되지 않은 것을 던지고있는 것 같습니다. 유형 (이상적으로 기본 유형)이 무엇인지 알아야합니다.

1

나는 약간 혼란 스럽다. 한편으로는 catch(std::exception)이 작동하지 않습니다 (catch(const std::exception&), BTW를 사용해야합니다). 반면에 사용자는 std::exception::what()을 작성합니다. 처음에 std::exception이 없으면 어떻게 했습니까?당신이 ... 아무것도하지만 잡은 후

어쨌든, 당신은 RTTI 정보 로그온을 시도 할 수 있습니다 : 표준이 std::type_info::name()의 결과의 가정을하지 않지만

#include <typeinfo> 

try { 
    foreign_code(my_data); 
} catch(const some_type& x) { 
    std::cerr << "Yikes! Caught exception of type '" 
      << typeid(x).name() 
      << "' with its hand in the cookie jar!\n"; 
    std::abort(); 
} 

을, (모든 경우 대부분의) 컴파일러는 적어도 다소 유용하게 사용할 수있는 코드를 생성합니다.

VS 디버거 안에있을 때 예외가 발생해도 중단되도록 VS 디버거를 설정할 수 있습니다. 그게 당신에게 스택 추적을 제공하므로 DLL에 전달 된 데이터가 문제를 일으킬 수 있다는 단서를 줄 수 있습니다.

+0

나는 catch (const some_type & x) 에 어떤 유형을 넣을 지 모르기 때문에 문제를 해결하는 방법을 이해하지 못한다. 그는 RTTI 정보가 필요 없다고 알고있다. –

+0

@Itay, 그건 내가 혼란스러워했다. user228058은'std :: exception :: what()'을 호출했다.'some_type'은 반드시'std :: exception'의 자손 이어야만한다. ("처음에는 std :: except가 없다면 어떻게 했습니까?") 그리고 그 코드 위에 나는 "...을 잡았을 때"[...]라고 명시 적으로 썼습니다. [...] ". – sbi

3

제대로 이해했다면 문제의 원인을 제 3 자 라이브러리에 대한 특정 호출로 좁혔지만 실제 애플리케이션을 디버깅 할 수는 없습니다 (이유는 묻고 싶습니까?), 귀하의 질문은 "예외가 무엇인지에 대한 지식 없이도 예외를 디버깅 할 수있는 방법은 무엇입니까?"

대답은 할 수 없습니다. 당신이 관찰 한대로, 당신은 맹목적으로 추측하고 옳은 것을 포착하기를 바랍니다. 당신은 또한 (...)을 붙잡을 수 있지만, 그것은 당신에게 아무 것도 말하지 않을 것입니다. 실시간 디버깅이 가능하다면 예외가 발생할 때 중단되도록 디버거를 설정하고 진행중인 작업을 볼 수 있습니다.

제 생각에는 정답은 제 3 자 라이브러리에 문의하는 것입니다. 문제의 출처를 좁히고 질문하십시오. 예외를 throw하여 모듈 경계를 넘어 전파하도록 허용하는 것은 매우 나쁜 형식입니다. 그것은 나를 null 포인터 deref 또는 뭔가에 대한 Windows SEH 예외를 의심하고 catch (...) 캐치 같은 방식으로 컴파일하고 있습니다.

+0

또는 CException * 일 수 있습니다. –