Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;例外情况;线程试图读取或写入其没有相应访问权限的虚拟地址。”;_C++_Windows_Debugging_Minidump - Fatal编程技术网

C++ C++;例外情况;线程试图读取或写入其没有相应访问权限的虚拟地址。”;

C++ C++;例外情况;线程试图读取或写入其没有相应访问权限的虚拟地址。”;,c++,windows,debugging,minidump,C++,Windows,Debugging,Minidump,为了追踪一些难以重现的崩溃,我配置了UnhandledExceptionFilter来创建小转储文件,如下所述:和 已成功捕获转储,但我在解释堆栈信息方面运气不太好。希望其他人也会经历类似的事情,我将在下面提供尽可能多的细节。很抱歉,如果这个问题最终变得有点冗长 Visual Studio提供以下转储摘要: Dump Summary ------------ Dump File: MiniDump.dmp Last Write Time: 15/08/2012 22:07:22 Proc

为了追踪一些难以重现的崩溃,我配置了
UnhandledExceptionFilter
来创建小转储文件,如下所述:和

已成功捕获转储,但我在解释堆栈信息方面运气不太好。希望其他人也会经历类似的事情,我将在下面提供尽可能多的细节。很抱歉,如果这个问题最终变得有点冗长

Visual Studio提供以下转储摘要:

Dump Summary
------------
Dump File:  MiniDump.dmp
Last Write Time:    15/08/2012 22:07:22
Process Name:   Server.exe : C:\Project\Server.exe
Process Architecture:   x86
Exception Code: 0xC0000005
Exception Information:  The thread tried to read from or write to a virtual address for which it does not have the appropriate access.
Heap Information:   Not Present

System Information
------------------
OS Version: 6.1.7601
CLR Version(s): 

Modules
-------
Module Name Module Path Module Version
----------- ----------- --------------
Server.exe  C:\Project\Server.exe   1.0.0.1
ntdll.dll   C:\Windows\SysWOW64\ntdll.dll   6.1.7601.17725
kernel32.dll    C:\Windows\SysWOW64\kernel32.dll    6.1.7601.17651
KERNELBASE.dll  C:\Windows\SysWOW64\KERNELBASE.dll  6.1.7601.17651
mysqlpp_d.dll   C:\Projects\Ken11\bin\debug\mysqlpp_d.dll   0.0.0.0
wsock32.dll C:\Windows\System32\wsock32.dll 6.1.7600.16385
ws2_32.dll  C:\Windows\SysWOW64\ws2_32.dll  6.1.7601.17514
msvcrt.dll  C:\Windows\SysWOW64\msvcrt.dll  7.0.7601.17744
libmySQL.dll    C:\Projects\Ken11\bin\debug\libmySQL.dll    0.0.0.0
user32.dll  C:\Windows\SysWOW64\user32.dll  6.1.7601.17514
advapi32.dll    C:\Windows\SysWOW64\advapi32.dll    6.1.7601.17514
msvcp90d.dll    C:\Projects\Ken11\bin\debug\Microsoft.VC90.DebugCRT\msvcp90d.dll    9.0.21022.8
msvcr90d.dll    C:\Projects\Ken11\bin\debug\Microsoft.VC90.DebugCRT\msvcr90d.dll    9.0.21022.8
mfc90d.dll  C:\Projects\Ken11\bin\debug\Microsoft.VC90.DebugMFC\mfc90d.dll  9.0.21022.8
dbghelp.dll C:\Windows\System32\dbghelp.dll 6.1.7601.17514
mswsock.dll C:\Windows\System32\mswsock.dll 6.1.7601.17514
wininet.dll C:\Windows\SysWOW64\wininet.dll 8.0.7601.17785
rasman.dll  C:\Windows\System32\rasman.dll  6.1.7600.16385
devobj.dll  C:\Windows\SysWOW64\devobj.dll  6.1.7601.17621
查看发生异常的线程堆栈,我们得到以下极短的调用堆栈:

    msvcr90d.dll!6d69f824()     
    [Frames below may be incorrect and/or missing, no symbols loaded for msvcr90d.dll]  
--> Server.exe!CServer::LoadPageList()  Line 269 + 0x28 bytes   C++
    cccccccc()  
应用程序中所有正确的线程都有很好的干净堆栈,显示返回到
\uu RtlUserThreadStart
的调用,例如:

mswsock.dll!_WSPRecv@36()  + 0x34ff bytes   
ws2_32.dll!_WSARecv@28()  + 0x71 bytes  
wsock32.dll!_recv@16()  + 0x33 bytes    
>libmySQL.dll!008aaa2f()    
[Frames below may be incorrect and/or missing, no symbols loaded for libmySQL.dll]  
libmySQL.dll!008aac0d()     
libmySQL.dll!008a34d7()     
libmySQL.dll!008a30d2()     
libmySQL.dll!0084be35()     
libmySQL.dll!00851572()     
libmySQL.dll!00851c2b()     
Server.exe!CServer::logStatusToDB(AsynchStatus_T * pStatus=0x04f18170)  Line 1717   C++
Server.exe!CServer::checkStatus(AsynchStatus_T * pStatus=0x04f18170)  Line 2145 C++
Server.exe!CThread::ControllingFunction(void * lpParameter=0x03fffe08)  Line 1280 + 0xf bytes   C++
kernel32.dll!@BaseThreadInitThunk@12()  + 0x12 bytes    
ntdll.dll!___RtlUserThreadStart@8()  + 0x27 bytes   
ntdll.dll!__RtlUserThreadStart@8()  + 0x1b bytes    
崩溃线程堆栈的下部如何被0xCCCC替换

为了完整起见,这里是对frame
Server.exe的反汇编!CServer::LoadPageList()行269+0x28字节

00453217  mov         byte ptr [ebp-4],0  
0045321B  mov         esi,esp  
0045321D  lea         ecx,[ebp-104h]  
00453223  call        dword ptr [__imp_ATL::CStringT<char,StrTraitMFC_DLL<char,ATL::ChTraitsCRT<char> > >::~CStringT<char,StrTraitMFC_DLL<char,ATL::ChTraitsCRT<char> > > (6DA994h)]  
00453229  cmp         esi,esp  
0045322B  call        _RTC_CheckEsp (690D20h)  
00453230  mov         dword ptr [ebp-4],0FFFFFFFFh  
00453237  mov         esi,esp  
00453239  lea         ecx,[ebp-20h]  
0045323C  call        dword ptr [__imp_ATL::CStringT<char,StrTraitMFC_DLL<char,ATL::ChTraitsCRT<char> > >::~CStringT<char,StrTraitMFC_DLL<char,ATL::ChTraitsCRT<char> > > (6DA994h)]  
00453242  cmp         esi,esp  
00453244  call        _RTC_CheckEsp (690D20h)  
00453249  push        edx  
0045324A  mov         ecx,ebp  
0045324C  push        eax  
0045324D  lea         edx,[ (45327Ch)]  
00453253  call        _RTC_CheckStackVars (690D50h)  
00453258  pop         eax             <<<=== exception refers to this line
00453259  pop         edx  
0045325A  mov         ecx,dword ptr [ebp-0Ch]  
0045325D  mov         dword ptr fs:[0],ecx  
00453264  pop         ecx  
00453265  pop         edi  

<> P>奇怪的是,函数Load PultListRealts中的所有操作都成功完成,崩溃似乎发生在字符串的析构函数在从这个堆栈框架返回之前调用。

我认为实际的C++源代码CServer::LoadPageList < /C> >而不是汇编程序转储会更有帮助,特别是如果它包含了一个关于第269行的提示。谢谢Joachim,你已经更新了,包括了来源What is _pSession???这似乎破坏了堆栈
\u pSession->ReadPage(\u T(“/Pages”),true这是我继承的一个笨重的http客户机-我能假设如果堆栈在LoadPageList之前已经损坏,它不会走到现在吗?我将把ReadPage视为主要候选对象,是否有任何方法可以创建一个异常作为腐败点而不是事后?不幸的是,如果有什么东西完全破坏了堆栈,那么对
LoadPageList
的引用可能是一种误导。
cccc
通常用作内存填充,以确保程序跳入未知时崩溃,这表明您看到的不是“真实”堆栈,而是随机内存。检查堆栈指针(
esp
)是否有意义。
void CServer::LoadPageList()
{
    CString header;
    header.Format("Accept: text/plain, */*; q=0.01\r\n");
    _pSession->setHttpHeader (header);
    _pSession->ReadPage (_T("/Pages"), true);
    SaveTimeStampedFile ("Pages.txt");
}