2009-10-15 5 views
0

나는 응용 프로그램을 디버깅 중이고 segfault를 일으키는 인스턴스가 많은 인스턴스를 결정하는 것이 거의 불가능한 위치에서 segfaults를 발생시킵니다.gdb를 사용하여 객체가 인스턴스화 된 위치를 어떻게 알 수 있습니까?

개체가 생성 된 위치를 확인할 수 있으면 문제가 발생한 인스턴스를 파악하고 버그를 해결할 수 있다고 생각했습니다.

이 정보를 검색하려면 gdb (또는 다른 응용 프로그램)가 물론 기본 malloc/new/new [] 구현을 재정의해야하지만 내 응용 프로그램을 설치하는 것은 괜찮습니다.

하나는 내가 단지 일 전에 라인에 그 세그먼테이션 폴트 (segfault)를 중단 점을 넣을 수 있다고 주장하고 거기에서 객체로 단계, 그러나 문제는 이것이 다른 많은에게 를 처리하는 중앙 메시지 발송자 루프 것입니다 수 메시지와 나는 오작동하는 객체를 잡는 방식으로 중단 점 조건을 설정할 수 없다.

+1

질문에 대한 직접적인 대답은 아니지만 valgrind/memcheck에서 실행 해 보았습니까? –

+0

http://linux.die.net/man/3/efence도 살펴볼 수 있습니다.이 경우에 도움이 될 것 같습니다. –

+0

전화하세요. 나는 가지고 있고 저에게 "크기 4의 잘못된 읽기"를 주었다. 그러나 그것은 메시지 디스패처 루프 자체의 반복자에 대해서만 지적했습니다. 이게 실제로 문제가되는 것, 즉 반복되는 std :: list가 루프 내에서 변경되고있는 것으로 의심됩니다. 따라서이 부분을 자세히 살펴볼 것입니다. – anorm

답변

1

메모리 디버깅 라이브러리 (예 : dmalloc)를 사용해 보셨습니까? 이들 중 상당수는 이미 할당 등이 이루어진 곳에서 새로운 정보 등을 기록합니다. 그래도 gdb에서 다른 사람보다 쉽게 ​​액세스 할 수 있습니다. http://www.allinea.com/index.php?page=48

+0

두 답변 중 (현재로서는) 이것이 가장 좋은 대안 인 것으로 보입니다. 감사 – anorm

3

따라서 segfault가 발생하는 지점에서 개체를 만들었지 만 그러한 개체를 만드는 많은 코드 조각 중 어느 것이 생성되었는지는 알지 못합니다. 그렇습니까?

나는 모든 객체 생성 비트를 계측하고 파일과 라인 번호와 함께 파일에 생성 된 각 객체의 주소를 기록하도록합니다. __LINE__ 및 __FILE__ 사전 정의 된 매크로는이 작업을 쉽게 수행 할 수 있습니다.).

그런 다음 디버거에서 응용 프로그램을 실행하고 segfault를 트랩 한 다음 로그에서 문제가되는 객체의 주소를 찾아서 생성 된 위치를 찾으십시오. 다음 양파의 다음 층을 껍질을 벗기십시오.

0

내가 처음 세그멘트 폴트가 발생할 때 GDB의 역 추적 명령을 사용하려고 할 것입니다 :

이 제품은 당신이 원하는 않는 메모리 디버깅 기능이 있습니다. 그게 나에게 무슨 일이 일어나고 있는지에 대한 좋은 단서를 제공하지 않는다면, 나는 valgrind를 사용하여 메모리 누수가 있는지 확인하려고 할 것입니다. 이 두 단계는 대개 내 경험에 비추어 볼 때 대부분의 경우 문제 범위를 좁히는 데 충분합니다.

감사합니다.

관련 문제