Re: std::list.back()引起的崩溃
C/C++本地代码调试
std::list.back()引起的崩溃
yeluosong
2014-02-07, 22:44 下午
简化后的代码如下:
std::list std::string test;省略了尖括号(不能显示)
test.back();
这个是错误的写法,在调用back之前没有判断test.empty()是否不为真.
如果不注意把这样的代码发布了出去,当引起崩溃想要来调试时(出错模块是release版)却很难找到出错的这个位置:
1)使用windbg起崩溃进程
2)把windbg设置成默认的调试器,崩溃时自动挂进去
3) 直接看出错弹出的错误框信息
这三个方法都不好找这个错误位置。
大家有没有比较好的方法,能迅速找到这个出错位置?
Re: std::list.back()引起的崩溃
格蠹老雷
2014-02-08, 13:26 下午
用下面的小程序试了下,正常结束
#include "stdafx.h"
#include <iostream>
#include <list>
using namespace std;
int main(int argc, char* argv[])
{
std::list<std::string> test;
test.back();
printf("Hello World!\n");
return 0;
}
Re: std::list.back()引起的崩溃
yeluosong
2014-02-08, 16:48 下午
vs2008可以重现,附件是用2008编的。
这个还好,back会调用terminateprocess,windbg会断下来,kv就可以看到。
下面我还有一个dll,这种情况会难搞点,见下一个回复
Re: std::list.back()引起的崩溃
yeluosong
2014-02-08, 16:59 下午
这个是一个bho插件 ,只有一个简单的bho框架 ,在 BEFORENAVIGATE2事件里加了测试代码
else if ( dispidMember == DISPID_BEFORENAVIGATE2 )
{
IDispatch *pDisp = pDispParams->rgvarg
.pdispVal;
VARIANT *pUrl = pDispParams->rgvarg[5].pvarVal;
BOOL bTopFrame = m_spWebBrowser2.IsEqualObject(pDisp) && VT_BSTR == pUrl->vt;
if (bTopFrame)
{
std::list<std::string> test;
test.back();
}
}
注册方法 :管理员权限起 cmd
regsvr32 x:\xxx\xxx\simplebho.dll
效果就是打开ie就会崩溃,但用第一个帖子的三个方法 都是找不到出错点的 。
找到了二个比较搓的方法来找出错点 :
1) windbg起进程 ,在出错模块未加载之前 bp kernel32!terminateprocess
2) 改模块 ,增加几行代码 :
void myInvalidParameterHandler(const wchar_t* expression,
const wchar_t* function,
const wchar_t* file,
unsigned int line,
uintptr_t pReserved)
{
_asm int 3;
}
_invalid_parameter_handler oldHandler, newHandler;
newHandler = myInvalidParameterHandler;
oldHandler = _set_invalid_parameter_handler(newHandler);
Re: std::list.back()引起的崩溃
yeluosong
2014-02-08, 17:01 下午
bho附件 ,附件传不上来,,改了扩展名为 ext也不行, 没办法
Re: std::list.back()引起的崩溃
格蠹老雷
2014-02-12, 20:53 下午
可以启用堆的调试支持,如果有《软件调试》的话,看一下第23章