2010-08-18 8 views
0

우선 Visual Studio 2008로 컴파일 된 Windows 32 비트 시스템에서 C로 실행하고 있습니다. 디버그 모드로 실행 중입니다. 내 코드는 기본적으로 이것이다 :왜 execvp를 호출 할 때이 오류가 발생하지 않습니까?

argv[0] = "pgserv"; 
argv[1] = "pgserv"; 
argv[2] = NULL; 

예, 그 인수로 pgservpgserv 응용 프로그램을 호출하는 것을 알고 있지만, 작품 : argv 세 가지 항목을 가지고 다음과 같습니다

execvp(*argv, argv); 

커맨드 라인에서 잘하고 이것이 프레임 워크의 일부인 유물의 일종입니다. 같은 내가 '왜 내가 손해를보고 완전히 해요

hub.exe!_free_dbg_nolock(void * pUserData=0x024c1408, int nBlockUse=1) Line 1323 + 0x54 bytes C++ 
hub.exe!_free_dbg(void * pUserData=0x024c1408, int nBlockUse=1) Line 1258 + 0xd bytes C++ 
hub.exe!free(void * pUserData=0x024c1408) Line 49 + 0xb bytes C++ 
hub.exe!_execve(const char * name=0x02523a10, const char * const * argv=0x02514e38, const char * const * envp=0x00000000) Line 322 + 0x8 bytes C 
hub.exe!_execvpe(const char * filename=0x02523a10, const char * const * argvector=0x02514e38, const char * const * envptr=0x00000000) Line 87 + 0xc bytes C 
hub.exe!_execvp(const char * filename=0x02523a10, const char * const * argvector=0x02514e38) Line 47 + 0xd bytes C 
hub.exe!execmd(char * cmd=0x02523a10) Line 25 + 0xf bytes C 

:

이 줄을 치면 어쨌든

, 그것은 호출 스택의 dbgheap.c/_free_dbg_nolock()

_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)); 

탑이 어설 트리거 d는 execvp()을 올바르게 호출하고 있으며이 코드는 argv이 성공적으로 호출되면서 꽤 자주 호출된다고 믿어 의심치 않습니다. 어떤 아이디어/도움이 내 문제입니까? 감사.

+0

null는 아니고,'argv' 배열을 종료하고있는 것처럼 보입니다. 아니면 당신의 모범에서 벗어 났습니까? –

+0

나는 예제에서 빠져있다. 질문 업데이트 중입니다. – Morinar

+0

@Morinar - 너무 조금 늦었습니다. –

답변

2

free의 실패는 일반적으로 두 가지 중 하나를 의미 중 하나는 free에 당신이 malloc에서 취득하지 않은 포인터를하려는 (또는 이미 해제 한 것을) 또는 힙이 손상되었습니다. free이 시스템 라이브러리에서 왔기 때문에 코드가 힙을 이전에 손상 시켰고 메모리 할당 시스템이 방금 알아 차렸을 가능성이 있습니다.

이미 디버거에 있으므로 0x024c1408 직전에 어떤 개체가 있었는지 확인하십시오. 아마 버퍼가 넘칠 것입니다. (물론, execvp를 호출하기 전에 문제의 객체를 해방했을 가능성이 있습니다. 버그가 추적하기 어려울 수 있습니다.)

+0

'0x024c1408'은'_execve()'에 할당되었고 바로 전에 바이트는 명백하지 않습니다. 또 다시 10 정도는'_execve()'에 의해 할당 된 것처럼 보입니다 (pgserv + exension의 첫 번째 순열). 그게 나에게 많은 것을 알려주지는 모르겠다. ... – Morinar

+0

@Morinar : 'pHead'근처에서 (실패한 주장에서) 확인한다. 손상된 데이터 구조는'free'의 인수가 아닌'free' 또는'_free_dbg'가 보인다. 그래도 여전히 실패하면 http://stackoverflow.com/questions/413477 또는 다른 유사한 질문에 언급 된 도구를 사용해보십시오. – Gilles

+0

여기서 무슨 일이 벌어지고 있는지 전혀 모르겠지만 결국 프레임 워크와의 관계에서 "잘못하고있다"고 생각했습니다. 나는 당신에게 세부 사항을 줄 것이지만, 그것들은 우리의 응용 프로그램에 매우 특정한 것이다. 뭔가 여전히 여전히 여기에 안좋은 것 같아요, 아마도 그것은 힙 손상입니다. 이것을 받아들이려고합니다. – Morinar

0

argv가 올바르게 null로 종료 되었습니까? 워드 프로세서에서 "포인터의 배열은 NULL 포인터로 끝나야한다"

const char* args[] = {"pgserv", "pgserv", NULL}; 

다음 정의 된 첫 번째 두 개의 매개 변수와 함께 호출

execvp(args[0], args) 

로 전화를 자신에게 물어 , "어떻게 execvp가 문자열 목록의 끝을 결정할 수 있습니까?" 그 대답은 당신이 제공하지 않는 연속적인 두 개의 NULL을 찾는다는 것입니다.

+0

위에서 지적한대로 제대로 종료됩니다. – Morinar

관련 문제