WriteFile导致程序崩溃的问题
昨天晚上写了一个测试读写文件速度的测试程序,一直调试错误,说的空指针访问。
先上源代码:
#include "stdafx.h"
#include <iostream>
using namespace std;
#include "CStopwatch.h"
const int BUFFER_SIZE = 8 * 1024;
int _tmain(int argc, _TCHAR* argv[])
{
char szBuffer[BUFFER_SIZE];
HANDLE hFile = ::CreateFile(_T("E:\\安装文件\\vs 2008\\VS2008TeamSuiteENU90DayTrialX1429235.iso"),
GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
HANDLE hFile_cpy = ::CreateFile(_T("E:\\安装文件\\vs 2008\\VS2008TeamSuiteENU90DayTrialX1429235.iso.bak"),
GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (INVALID_HANDLE_VALUE == hFile || INVALID_HANDLE_VALUE == hFile_cpy)
{
return -1;
}
DWORD dwByteRead = 0, dwByteWrite = 0;
CStopwatch stopwatch;
stopwatch.Start();
while (1)
{
::ReadFile(hFile, szBuffer, BUFFER_SIZE, &dwByteRead, NULL);
::WriteFile(hFile_cpy, szBuffer, dwByteRead, NULL, NULL);
if (dwByteRead < BUFFER_SIZE)
{
break;
}
}
printf("time = %d \n",stopwatch.Now());
::CloseHandle(hFile);
::CloseHandle(hFile_cpy);
return 0;
}
程序会在WriteFile的地方出现空指针访问。用vs调试吧,发现调试信息不够。Alt+8反汇编,还是不够。正好最近用了下windbg,果断试试!
直接运行到崩溃处:
可见,程序尝试向edi寄存器内容所指向的空间写内容,也就是00000000处。这明显是一个空指针访问违例!
查看msdn以后才知道,原来当ReadFile和WriteFile的lpOverlapped参数为NULL时,那么必须指定一定有效的地址用来存放读写的字节数。上面我指定了一个null,所以才会出现空指针访问。这点从上面的反汇编结果可以知道这点。
最后补充下,为什么这里不用vs呢?原因是信息不够,顺便我也想用下windbg,装下13,呵呵



浙公网安备 33010602011771号