2014-02-17 2 views
2

GDB를 사용하여 프로그램을 디버깅하는 동안 디버그 모드에서 프로그램을 중지하는 데 문제가 발생했습니다. 백 트레이스를 수행 할 때 독점적 인 제 3 자 라이브러리 콜 스택 내에서 깊이있는 것을 발견했으며 프로그램이 중단 된 이유를 찾아야합니다. 나는 여전히 GDB 초보자이므로이 작업을 수행하는 방법을 여전히 잘 모르고있다. backtrace에서 나는 "__cxa_throw() from /usr/lib64/libstdc++.so.6"을 알아 차 렸습니다. 그래서 어떤 종류의 예외는 던져 졌다고 추측합니다. 그러나 그것에 대한 자세한 정보를 얻는 방법을 알고 싶습니다. 가능한.gdb가 멈춘 이유는 무엇입니까?

+0

gdb "up"명령을 사용하면 호출 스택에서 한 레벨 위로 포커스를 이동할 수 있습니다. 예외가 발생하기 전까지 코드가 존재하는 지점으로 이동하면 그 시점에서 수행 한 작업을 볼 수 있습니다. 잘못된 데이터가 포함 된 함수를 호출하는지 확인하십시오. – mah

+0

나는 그렇게했고 내 코드의 모든 것이 (적어도 그들의 문서에 따르면) 좋게 보인다. – Brian

답변

0

GDB가

을 중지 이유를 알아 어떻게 GDB는 보통 바로, 예를 알려줍니다

Program received signal SIGABRT, Aborted. 
0x00007ffff7750425 in __GI_raise (sig=<optimized out>) 

신호가 수신 되었기 때문에 프로그램이 중단되었습니다.

독점적 인 써드 파티 라이브러리 호출 스택에 깊이있는 것을 발견했습니다. 왜 프로그램이 멈추는 지 정확히 알아 내기 위해 노력하고 있습니다.

GDB에서 언급 한 이유 때문에 정확히이 중지되었습니다.

내가 __cxa_throw() from /usr/lib64/libstdc++.so.6 그래서 난 어떤 종류의 예외가 발생 된 것으로 추정하고있다하지만 난 그것에 대해 더 많은 정보를 얻을하는 방법을 알고 싶습니다 것으로 나타났습니다 역 추적에서 찾고있다. __cxa_throw

존재는 예외가 발생하고있다 (그리고 std::terminate()의 존재가 잡히지 않은 예외임을 나타냄) 것을 나타 않는다. 타사 라이브러리의 디버그 정보없이

는 원인을 찾는 당신의 선택은 제한됩니다

  • 당신은이 라이브러리의 문서를 읽을 수 있습니다 당신이 어떤 전제 조건을 위반하지 않았 음을 더블 체크 그것은 그 필요합니다
  • __cxa_throw이라는 루틴을 분해하여 해당 루틴이 호출 된 이유를 정확하게 파악할 수 있습니다.
1

backtrace 명령을 사용하여 프로그램 상태를 보여줍니다. Here 자세한 내용을 확인할 수 있습니다.

+0

나는 그것을 시험해 보았고 예외가 던져진 곳으로 이끌었다. "왜"에 대한 대답이 가능하지 않지만 여기에 대한 희망이 있다면 나는 놀라지 않을 것입니다. – Brian

+0

hm. 나는 그 문제를 일으킨 원인이 있을지도 모르기 때문에 일반적으로 프레임으로 건너 뛴다. 'list' 명령으로 특정 프레임의 소스 코드를 볼 수 있습니까? 디버깅중인 코드가'-ggdb -DFULLDEBUG -O0' 옵션으로 컴파일되었는지 확인 하시겠습니까? – tmaric

+0

실제로 제 디버거 정보로 빌드하지 않은 제 3 자 라이브러리가 있다고 확신 할 수 있습니다.* 한숨 * – Brian

관련 문제