하자 희망을 호출 할 때 내가 할 수있는 내가 테스트 프로그램이있어이 아래로충돌 라이브러리를
... 중요한 세부 사항을 떠나지 않고 벙어리 : 나는 컴파일
#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 공격이라고합니다.
"더 이상 관련 없음"으로 질문을 닫을 수 있습니다. 어쨌든 고마워!
힘든 부분. 게시 한 코드가 실제로 실행되는 코드입니까, 아니면 일러스트레이션을위한 주요 단순화입니까? 이것이 실제로 실행되는 것이 더 많거나 적은 경우 run 메소드로 점프하기 전에 중단 점을 설정하십시오. vfptr-table이 손상되었는지 확인하십시오. 인수가 올바르게 전달되었는지 점검하십시오. 처음에는 더 이상 생각할 필요가 없습니다. 글쎄, 또한 valgrind에서 프로그램을 실행하고 일반적인 메모리 검사를하도록하십시오. – gimpf
왼쪽 필드 제안/질문 - 정의를 어둡게하는 INPUT에 #define이 없습니까? –
@ Timo : 어디에도 정의 할 수 없습니다[email protected] gimpf : 물론 많은 것들이 빠져 있습니다. 표시된 함수는 실제로 매개 변수를 가지고 있습니다 (run()은 예외로 표시되어 있습니다). 그리고 효과적으로 작동하지 않는 코드는 빠져 있습니다. (반환 값, 상태 메시지 등을 확인하는 것은 run()이 충돌 할 때까지 모두 OK를 반환합니다.) vfptr/valgrind를 확인한 다음 다시보고합니다. – DevSolar