首先,我在使用Visual Studio 2008编译的Windows 32位系统上运行C语言。我正在调试模式下运行。我的代码基本上是这样的:
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
不同成功。关于我的问题是什么的任何想法/帮助?感谢。
答案 0 :(得分:2)
free
中的失败通常意味着以下两种情况之一:要么你试图free
你没有从malloc
获得的指针(或者你已经释放了,或者堆已经损坏了。由于free
来自系统库,因此您的代码可能更早地破坏了堆,并且内存分配系统才刚刚注意到。
由于您已经在调试器中,因此请查看0x024c1408之前的对象。你可能在那里溢出了一个缓冲区。 (当然,在调用execvp
之前,您可能已经释放了有问题的对象,在这种情况下,可能很难找到错误。)
答案 1 :(得分:0)
argv是否正确null终止?从文档中,“指针数组必须由NULL指针终止”:
const char* args[] = {"pgserv", "pgserv", NULL};
然后用
调用它execvp(args[0], args)
当您仅使用定义的前两个参数调用它时,请问自己:“execvp如何确定字符串列表的结尾?”答案是它在一行中查找两个NULL,你没有提供。