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,呵呵