Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

C/C++本地代码调试

帖子发起人: yeluosong   发起时间: 2014-02-07 22:44 下午   回复: 5

Print Search
帖子排序:    
   2014-02-07, 22:44 下午
yeluosong 离线,最后访问时间: 2013/8/23 6:29:43 yeluosong

发帖数前150位
注册: 2013-01-30
发 贴: 9
std::list.back()引起的崩溃
Reply Quote
简化后的代码如下:
std::list std::string test;省略了尖括号(不能显示)
test.back();
这个是错误的写法,在调用back之前没有判断test.empty()是否不为真.

如果不注意把这样的代码发布了出去,当引起崩溃想要来调试时(出错模块是release版)却很难找到出错的这个位置:
1)使用windbg起崩溃进程
2)把windbg设置成默认的调试器,崩溃时自动挂进去
3) 直接看出错弹出的错误框信息
这三个方法都不好找这个错误位置。

大家有没有比较好的方法,能迅速找到这个出错位置?
IP 地址: 已记录   报告
   2014-02-08, 13:26 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: std::list.back()引起的崩溃
Reply Quote
用下面的小程序试了下,正常结束

#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/8/23 6:29:43 yeluosong

发帖数前150位
注册: 2013-01-30
发 贴: 9
Re: std::list.back()引起的崩溃
Reply Quote
vs2008可以重现,附件是用2008编的。
这个还好,back会调用terminateprocess,windbg会断下来,kv就可以看到。
下面我还有一个dll,这种情况会难搞点,见下一个回复


IP 地址: 已记录   报告
   2014-02-08, 16:59 下午
yeluosong 离线,最后访问时间: 2013/8/23 6:29:43 yeluosong

发帖数前150位
注册: 2013-01-30
发 贴: 9
Re: std::list.back()引起的崩溃
Reply Quote
这个是一个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);

IP 地址: 已记录   报告
   2014-02-08, 17:01 下午
yeluosong 离线,最后访问时间: 2013/8/23 6:29:43 yeluosong

发帖数前150位
注册: 2013-01-30
发 贴: 9
Re: std::list.back()引起的崩溃
Reply Quote
bho附件 ,附件传不上来,,改了扩展名为 ext也不行,  没办法 
IP 地址: 已记录   报告
   2014-02-12, 20:53 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: std::list.back()引起的崩溃
Reply Quote
可以启用堆的调试支持,如果有《软件调试》的话,看一下第23章
IP 地址: 已记录   报告
高端调试 » 软件调试 » C/C++本地代码调试 » Re: std::list.back()引起的崩溃

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.