|
|
|
|
|
|
|
C/C++本地代码调试
帖子发起人: yeluosong 发起时间: 2014-02-07 22:44 下午 回复: 5
|
帖子排序:
|
|
|
|
2014-02-07, 22:44 下午
|
yeluosong
注册: 2013-01-30
发 贴: 9
|
|
|
简化后的代码如下:
std::list std::string test;省略了尖括号(不能显示)
test.back();
这个是错误的写法,在调用back之前没有判断test.empty()是否不为真.
如果不注意把这样的代码发布了出去,当引起崩溃想要来调试时(出错模块是release版)却很难找到出错的这个位置:
1)使用windbg起崩溃进程
2)把windbg设置成默认的调试器,崩溃时自动挂进去
3) 直接看出错弹出的错误框信息
这三个方法都不好找这个错误位置。
大家有没有比较好的方法,能迅速找到这个出错位置?
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2014-02-08, 13:26 下午
|
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
|
Re: std::list.back()引起的崩溃
|
|
|
|
用下面的小程序试了下,正常结束
#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; }
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2014-02-08, 16:48 下午
|
yeluosong
注册: 2013-01-30
发 贴: 9
|
Re: std::list.back()引起的崩溃
|
|
|
|
vs2008可以重现,附件是用2008编的。 这个还好,back会调用terminateprocess,windbg会断下来,kv就可以看到。 下面我还有一个dll,这种情况会难搞点,见下一个回复
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2014-02-08, 16:59 下午
|
yeluosong
注册: 2013-01-30
发 贴: 9
|
Re: std::list.back()引起的崩溃
|
|
|
|
这个是一个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);
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2014-02-08, 17:01 下午
|
yeluosong
注册: 2013-01-30
发 贴: 9
|
Re: std::list.back()引起的崩溃
|
|
|
|
bho附件 ,附件传不上来,,改了扩展名为 ext也不行, 没办法
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2014-02-12, 20:53 下午
|
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
|
Re: std::list.back()引起的崩溃
|
|
|
|
可以启用堆的调试支持,如果有《软件调试》的话,看一下第23章
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
高端调试 » 软件调试 » C/C++本地代码调试 » Re: std::list.back()引起的崩溃
|
|
|
|
|
|