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->rgvargDevil [6].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章

Powered by Community Server Powered by CnForums.Net