GetOverlappedResult()在运行时崩溃,但在vc++ 2010调试时不会崩溃
GetOverlappedResult() crashes at runtime, but not while debugging from VC++ 2010
我使用重叠的I/O来读写串行端口。当从命令提示符执行exe时,程序将崩溃("xxxx.exe遇到问题,需要关闭…")。使用此方法的代码块以及应用程序崩溃的地方在它崩溃之前被调用了几次,并且正常工作。奇怪的是,当我在调试模式下运行vc++ 2010的可执行文件时,它没有崩溃。
这是GetOverlappedResult()崩溃的代码块…
memset( &ov, 0, sizeof(OVERLAPPED) );
ov.hEvent = CreateEvent( NULL, TRUE, TRUE, NULL );
if( !Comm.Read( lpbBuffer, 1, &dwBytesRead, &ov ) )
if( GetLastError() != ERROR_IO_PENDING )
return FALSE;
if( !Comm.GetOverlappedResult(&ov,&dwBytesRead,TRUE) )
{
printf("Resync: Comm.GetOverlappedResult() failed with error code %un", GetLastError() );
return FALSE;
}
Comm.GetOverlappedResult源()
BOOL SerialAsync::GetOverlappedResult( LPOVERLAPPED lpOverlapped, LPDWORD lpNumberOfBytesTransferred, BOOL bWait )
{
printf("made it heren");
BOOL ret = ::GetOverlappedResult( hComm, lpOverlapped, lpNumberOfBytesTransferred, bWait );
printf("made it here toon");
return ret;
}
我已经确保hComm,重叠的结构体和指针lpnumberofbytestrtransferred是有效的。
编辑
添加调试器环境变量后,程序将在调试器中崩溃…调试器打开文件tidtable.c并指向#ifdef
后面的第一行代码。/***
* __set_flsgetvalue - crt wrapper for setting up FlsGetValue pointer in TLS
*
* Purpose:
* This function helps msvcmXX.dll threadstart and threadstartex APIs
* to set FlsGetValue pointer before calling __fls_getvalue.
*
*******************************************************************************/
_CRTIMP PFLS_GETVALUE_FUNCTION __cdecl __set_flsgetvalue()
{
#ifdef _M_IX86
PFLS_GETVALUE_FUNCTION flsGetValue = FLS_GETVALUE;
if (!flsGetValue)
{
flsGetValue = DecodePointer(gpFlsGetValue);
TlsSetValue(__getvalueindex, flsGetValue);
}
return flsGetValue;
#else /* _M_IX86 */
return NULL;
#endif /* _M_IX86 */
}
edit2
这是在函数终止前被调用的函数
BOOL Resync( LPBYTE lpbBuffer )
{
DWORD dwBytesRead;
while( Comm.Read( lpbBuffer, 1, &dwBytesRead ) )
if( DDCMP_SOH == *lpbBuffer || DDCMP_ENQ == *lpbBuffer )
return TRUE;
return FALSE;
}
这就是我改变我的AsyncSerial::Read()命令为
BOOL SerialAsync::ReadOverlapped( LPBYTE lpbBuffer, DWORD dwSize, LPDWORD dwBytesRead, LPOVERLAPPED lpOverlapped )
{
return ReadFile( hComm, lpbBuffer, dwSize, dwBytesRead, lpOverlapped );
}
BOOL SerialAsync::Read( LPBYTE lpbBuffer, DWORD dwSize, LPDWORD dwBytesRead )
{
BOOL bResult = TRUE;
OVERLAPPED ov;
memset( &ov, 0, sizeof(OVERLAPPED) );
ov.hEvent = CreateEvent(NULL,TRUE,TRUE,NULL);
if( !ReadOverlapped(lpbBuffer,dwSize,dwBytesRead,&ov) )
bResult = GetLastError() == ERROR_IO_PENDING;
if( bResult )
bResult = GetOverlappedResult(&ov,dwBytesRead,TRUE);
CloseHandle( ov.hEvent );
return bResult;
}
c++和它的内存问题。你似乎有一堆腐败。它在调试器下工作的原因很可能是由于调试堆。这种症状也被称为海森堡bug,当你仔细观察它时,它就会消失。您可以在项目的调试器选项中的进程环境中设置环境变量_NO_DEBUG_HEAP=1,也可以看到应用程序在调试器下崩溃。
您提供的代码不包含任何内存分配,所以我无法猜测您的实际问题是什么。
就我个人而言,我会切换到黑暗的一面(c#, f#),垃圾收集器在我之后清理。
我终于解决了崩溃问题。它似乎与GetOverlappedResult()函数没有直接关系。这个问题与线程有关。我的程序中有三个线程,主线程,一个从串行端口读取数据的线程,一个向串行端口写入数据的线程。我知道正在写的线程在到达这个点之前已经退出了,而不是假设问题在我的读线程中,我应该查看我的主线程。
谢谢你的帮助。
- 当回溯以零开始时,如何调试崩溃
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 程序崩溃并显示"std::out_of_range"错误
- CoInitialize()在单独的线程上崩溃而不返回
- 使用调试/崩溃报告将应用程序部署到客户端
- 为什么所有C++编译器都会崩溃或挂起此代码
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 为什么我的多线程作业队列崩溃
- ExtractIconEx:可以工作,但偶尔会崩溃
- 为什么引用传递会导致此崩溃(C++)
- __declspec(dllimport)导致MSVC 2010上的编译器崩溃
- 为什么在VS 2010 C++中,我的程序在调试器中运行良好时会崩溃,但在没有调试器的情况下运行时会崩溃
- 类崩溃编译器中的 MSVC 2010 模板化映射
- C++代码在msdev 6.0中运行良好,在Visual Studio 2010中崩溃
- DoModal于2010年在visual studio中崩溃
- Visual Studio 2010 在尝试运行简单的"Hello World"代码时崩溃?
- GetOverlappedResult()在运行时崩溃,但在vc++ 2010调试时不会崩溃
- Visual Studio 2010在成功构建时崩溃
- VS 2010 C++在删除结构数组时崩溃