Почему этот бесплатный сбой при вызове execvp? - PullRequest
0 голосов
/ 19 августа 2010

Прежде всего, я работаю в C на 32-битной системе Windows, скомпилированной с Visual Studio 2008. Я работаю в режиме отладки. Мой код по существу таков:

execvp( *argv, argv );

Где argv имеет три записи и выглядит следующим образом:

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

Да, я знаю, что это вызывает приложение pgserv с pgserv в качестве аргумента, но это прекрасно работает из командной строки и является своего рода артефактом фреймворка, частью которого он является.

В любом случае, когда эта строка нажата, она вызывает это утверждение в dbgheap.c/_free_dbg_nolock()

_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));

Вершина стека вызовов:

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

Я в полном недоумении относительно того, почему я получу это утверждение здесь, так как считаю, что я правильно звоню execvp(), и этот код вызывается довольно часто, с разными argv успешно. Любые идеи / помощь в том, что моя проблема? Спасибо.

Ответы [ 2 ]

2 голосов
/ 19 августа 2010

Ошибка в free обычно означает одну из двух вещей: либо вы пытаетесь free указатель, который вы не получили от malloc (или который вы уже освободили), либо кучуиспорченПоскольку free поступает из системной библиотеки, скорее всего, ваш код ранее повредил кучу, а система выделения памяти только что заметила.

Поскольку вы уже находитесь в отладчике, посмотрите, чтоОбъект был незадолго до 0x024c1408.Вы, вероятно, переполнили буфер там.(Конечно, вы, возможно, уже освободили объект-нарушитель перед вызовом execvp, и в этом случае ошибку может быть трудно отследить.)

0 голосов
/ 19 августа 2010

Правильно ли завершено argv null?Из документов «Массив указателей должен заканчиваться указателем NULL»:

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

, затем вызывать его с

execvp(args[0], args)

Когда вы вызываете его только с первыми двумя параметрамиопределившись, спросите себя: "Как execvp может определить конец списка строк?"Ответ в том, что он ищет два NULL подряд, которые вы не предоставляете.

...