2009-08-20 4 views
2

하자 희망을 호출 할 때 내가 할 수있는 내가 테스트 프로그램이있어이 아래로충돌 라이브러리를

... 중요한 세부 사항을 떠나지 않고 벙어리 : 나는 컴파일

#include <lib.h> 

const char * INPUT = "xyz"; 

int main() 
{ 
    initializeLib(); 
    LibProcess * process = createLibProcess(); 
    fprintf(stderr, "Before run(%s)\n", INPUT); 
    process->run(INPUT); 
    fprintf(stderr, "After run(%s)\n", INPUT); 
    return 0; 
} 

이 테스트 프로그램 (GCC 4.1. 2)와 같은 실행

g++ -g -o test test.c -L /path/to/lib -I /path/to/include -lnameoflib 
export LD_LIBRARY_PATH=/path/to/lib 
./test 

도서관, 그래서의 구조 나에게 다소 복잡하고, 어떤 장소에서 너무나 똑똑하지, 그리고 가장 중요한-기록되지별로 나 불꽃하지 않는있다 관련된 기능 :

class ProcessBase 
{ 
    public: 
     virtual int run(const char* buffer = NULL) = 0; 
} 

class LibProcess : ProcessBase 
{ 
    public: 
     LibProcess() 
     { 
      fprintf("Reached LibProcess().\n"); 
     } 

     int run(const char* buffer = NULL) 
     { 
      fprintf(stderr, "Reached run().\n"); 
     } 
};    

void initializeLib() 
{ 
    // Preparing some data 
} 

ProcessBase * createLibProcess() 
{ 
    ProcessBase * process = new LibProcess(); 
    fprintf(stderr, "Created Process.\n"); 
    return (ProcessBase *) process; 
} 

지금까지는 그렇게 좋았습니다. 하지만 그 결과로 당황 스러웠습니다.

나는 어쩌면 완전히 다른 어딘가에 있습니다. 그러나 어떻게 이런 일이 가능합니까?

처음 라이브러리를 호출 할 때 테스트가 실패했는지 알 수 있습니다. 프로세스를 만들 때 테스트가 중단되었거나 실제로 이 실행될 때이 실행되면 이해할 수 있습니다.

그러나 어떻게 함수를 호출하고 실제로 그 함수에 도달하는 사이에 이 죽을 수 있습니까?

저는 우연이 아닙니다. 특히 디버깅을 계속하는 법을 모르겠습니다. 도움?

편집 : 예 : createLibProcess() 이후에 NULL이 아닌 값을 갖는 프로세스를 확인했습니다. 예제에서 빠진 두 개의 다른 멤버 함수 인 process의 호출은 아름답게 작동했습니다. 그러나 두 번째 멤버 함수는 버퍼 오버플로 및 삭제 된 프로세스로 인해 메모리를 trashed 호출합니다.

이렇게하면 질문이 잘못됩니다. 물론은 NULL-> run()을 segfaulting 공격이라고합니다.

"더 이상 관련 없음"으로 질문을 닫을 수 있습니다. 어쨌든 고마워!

+0

힘든 부분. 게시 한 코드가 실제로 실행되는 코드입니까, 아니면 일러스트레이션을위한 주요 단순화입니까? 이것이 실제로 실행되는 것이 더 많거나 적은 경우 run 메소드로 점프하기 전에 중단 점을 설정하십시오. vfptr-table이 손상되었는지 확인하십시오. 인수가 올바르게 전달되었는지 점검하십시오. 처음에는 더 이상 생각할 필요가 없습니다. 글쎄, 또한 valgrind에서 프로그램을 실행하고 일반적인 메모리 검사를하도록하십시오. – gimpf

+0

왼쪽 필드 제안/질문 - 정의를 어둡게하는 INPUT에 #define이 없습니까? –

+0

@ Timo : 어디에도 정의 할 수 없습니다[email protected] gimpf : 물론 많은 것들이 빠져 있습니다. 표시된 함수는 실제로 매개 변수를 가지고 있습니다 (run()은 예외로 표시되어 있습니다). 그리고 효과적으로 작동하지 않는 코드는 빠져 있습니다. (반환 값, 상태 메시지 등을 확인하는 것은 run()이 충돌 할 때까지 모두 OK를 반환합니다.) vfptr/valgrind를 확인한 다음 다시보고합니다. – DevSolar

답변

2

프로세스가 호출 실행으로 역 참조되기 전에 프로세스가 NULL이 아닌 유효 포인터로 올바르게 설정 되었습니까?

+0

ACK - 프로세스가 NULL이 아닙니다. – DevSolar

+0

업데이트 된 질문보기 – DevSolar

3

경우 :

LibProcess * process = createLibProcess(); 

반환 NULL, 또는 어떤 방법으로 유효하지 않은 프로세스가, 당신이보고 정확하게 동작을 얻을 것이다.

+0

프로세스가 유효합니다 - 예제를 읽을 수 있도록하기 위해 process-> run() 전에 성공적으로 호출 된 프로세스 멤버 함수 (process-> configure())를 제거했습니다. – DevSolar