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++本地代码调试

帖子发起人: purplethunder   发起时间: 2013-05-07 13:48 下午   回复: 5

Print Search
帖子排序:    
   2013-05-07, 13:48 下午
lxp 离线,最后访问时间: 2010/3/2 23:35:44 purplethunder

发帖数前500位
男
注册: 2009-05-06
发 贴: 3
Indifferent [:|] 什么样的情况会导致EXE会加载2份MSVCRT模块!!
Reply Quote
     最近碰到一个非常奇怪的Crash,在客户的电脑上会偶然出现Crash,出现Crash时有一个共同点,会出现加载2个不同版本的MSVCRT的示例,
因此导致进程里面出现2个CRT的堆,所以在释放内存的时候,出现了Crash。

按照Loadlibrary的一般逻辑:
    程序在调用Loadlibrary的时候,会调用LdrLoadDLL--LdrpFindOrMapDll---》LdrpFindLoadedDllByName---》
    如果进程中已经存在MSVCRT的DLL的时候,这个时候,不应该加载一份新版本的MSVCRT的实例才对,请各位帮忙看看有什么情况会出现已经存在一个CRT但是
    还会加载另外一个版本的CRT的情况发生。

    由于出现问题在客户那边,不好进行dump信息采集,只能根据我们程序自动采集上来的部分信息进行分析,发现是2个CRT堆导致的Crash。

lmvm信息如下:
0:000> lmvm msvc*
start    end        module name
60b80000 60c07000   msvcp80_60b80000   (deferred)             
    Mapped memory image file: C:\Windows\winsxs\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.6195_none_d09154e044272b9a\msvcp80.dll
    Image path: C:\Windows\winsxs\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.6195_none_d09154e044272b9a\msvcp80.dll
    Image name: msvcp80.dll
    Timestamp:        Sat May 14 09:35:40 2011 (4DCDDC6C)
    CheckSum:         0008D0CD
    ImageSize:        00087000
    File version:     8.0.50727.6195
    Product version:  8.0.50727.6195
    File flags:       0 (Mask 3F)
    File OS:          40004 NT Win32
    File type:        2.0 Dll
    File date:        00000000.00000000
    Translations:     0409.04b0
    CompanyName:      Microsoft Corporation
    ProductName:      Microsoft® Visual Studio® 2005
    InternalName:     MSVCP80.DLL
    OriginalFilename: MSVCP80.DLL
    ProductVersion:   8.00.50727.6195
    FileVersion:      8.00.50727.6195
    FileDescription:  Microsoft® C++ Runtime Library
    LegalCopyright:   © Microsoft Corporation.  All rights reserved.
660a0000 6613b000   msvcr80_660a0000   (deferred)             
    Mapped memory image file: C:\Windows\winsxs\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.6195_none_d09154e044272b9a\msvcr80.dll
    Image path: C:\Windows\winsxs\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.6195_none_d09154e044272b9a\msvcr80.dll
    Image name: msvcr80.dll
    Timestamp:        Sat May 14 09:33:39 2011 (4DCDDBF3)
    CheckSum:         000A071F
    ImageSize:        0009B000
    File version:     8.0.50727.6195
    Product version:  8.0.50727.6195
    File flags:       0 (Mask 3F)
    File OS:          40004 NT Win32
    File type:        2.0 Dll
    File date:        00000000.00000000
    Translations:     0409.04b0
    CompanyName:      Microsoft Corporation
    ProductName:      Microsoft® Visual Studio® 2005
    InternalName:     MSVCR80.DLL
    OriginalFilename: MSVCR80.DLL
    ProductVersion:   8.00.50727.6195
    FileVersion:      8.00.50727.6195
    FileDescription:  Microsoft® C Runtime Library
    LegalCopyright:   © Microsoft Corporation.  All rights reserved.
74820000 748bb000   msvcr80    (deferred)             
    Mapped memory image file: C:\Windows\winsxs\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4940_none_d08cc06a442b34fc\msvcr80.dll
    Image path: C:\Windows\winsxs\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4940_none_d08cc06a442b34fc\msvcr80.dll
    Image name: msvcr80.dll
    Timestamp:        Wed Sep 29 11:28:49 2010 (4CA2B271)
    CheckSum:         000A606B
    ImageSize:        0009B000
    File version:     8.0.50727.4940
    Product version:  8.0.50727.4940
    File flags:       0 (Mask 3F)
    File OS:          40004 NT Win32
    File type:        2.0 Dll
    File date:        00000000.00000000
    Translations:     0409.04b0
    CompanyName:      Microsoft Corporation
    ProductName:      Microsoft® Visual Studio® 2005
    InternalName:     MSVCR80.DLL
    OriginalFilename: MSVCR80.DLL
    ProductVersion:   8.00.50727.4940
    FileVersion:      8.00.50727.4940
    FileDescription:  Microsoft® C Runtime Library
    LegalCopyright:   © Microsoft Corporation.  All rights reserved.
748c0000 74947000   msvcp80    (deferred)             
    Mapped memory image file: C:\Windows\winsxs\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4940_none_d08cc06a442b34fc\msvcp80.dll
    Image path: C:\Windows\winsxs\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4940_none_d08cc06a442b34fc\msvcp80.dll
    Image name: msvcp80.dll
    Timestamp:        Wed Sep 29 11:30:12 2010 (4CA2B2C4)
    CheckSum:         0008D4B3
    ImageSize:        00087000
    File version:     8.0.50727.4940
    Product version:  8.0.50727.4940
    File flags:       0 (Mask 3F)
    File OS:          40004 NT Win32
    File type:        2.0 Dll
    File date:        00000000.00000000
    Translations:     0409.04b0
    CompanyName:      Microsoft Corporation
    ProductName:      Microsoft® Visual Studio® 2005
    InternalName:     MSVCP80.DLL
    OriginalFilename: MSVCP80.DLL
    ProductVersion:   8.00.50727.4940
    FileVersion:      8.00.50727.4940
    FileDescription:  Microsoft® C++ Runtime Library
    LegalCopyright:   © Microsoft Corporation.  All rights reserved.
75be0000 75c8c000   msvcrt     (deferred)             
    Mapped memory image file: f:\symbols\msvcrt.dll\4EEAF722ac000\msvcrt.dll
    Image path: C:\Windows\System32\msvcrt.dll
    Image name: msvcrt.dll
    Timestamp:        Fri Dec 16 15:45:38 2011 (4EEAF722)
    CheckSum:         000A8F06
    ImageSize:        000AC000
    File version:     7.0.7601.17744
    Product version:  6.1.8638.17744
    File flags:       0 (Mask 3F)
    File OS:          40004 NT Win32
    File type:        1.0 App
    File date:        00000000.00000000
    Translations:     0409.04b0
    CompanyName:      Microsoft Corporation
    ProductName:      Microsoft® Windows® Operating System
    InternalName:     msvcrt.dll
    OriginalFilename: msvcrt.dll
    ProductVersion:   7.0.7601.17744
    FileVersion:      7.0.7601.17744 (win7sp1_gdr.111215-1535)
    FileDescription:  Windows NT CRT DLL
    LegalCopyright:   © Microsoft Corporation. All rights reserved.


IP 地址: 已记录   报告
   2013-05-07, 23:41 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 什么样的情况会导致EXE会加载2份MSVCRT模块!!
Reply Quote

这非常正常,有时候可能有三四个,原因是进程中的不同模块(包括系统模块和第三方模块)使用了不同版本的编译器编译...


IP 地址: 已记录   报告
   2013-05-08, 00:21 上午
lxp 离线,最后访问时间: 2010/3/2 23:35:44 purplethunder

发帖数前500位
男
注册: 2009-05-06
发 贴: 3
Re: 什么样的情况会导致EXE会加载2份MSVCRT模块!!
Reply Quote
是使用同一个版本的编译器,找到原因了~~,由于进程启动后,用户安装了一个新版本的vcredist,在我们的进程重启之前,我们新加载一个依赖于CRT的DLL,这时候LoadLibrary 这个DLL的时候,winsxs查找CRT DLL的时候,会找到新版本的CRT DLL路径,但是由于LoadLibrary函数的LdrpFindOrMapDll是使用全路径来进行DLL是否已经加载的判断的,这时候会认为该DLL没有加载进入进程,所以会新加载一份新版本的CRT,从而导致多份CRT DLL被加载到内存中~~~
IP 地址: 已记录   报告
   2013-05-08, 11:26 上午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 什么样的情况会导致EXE会加载2份MSVCRT模块!!
Reply Quote

:(

你只能保证自己的模块是用同一个版本的编译器,即使如此,编译选项也可能导致多个CRT实例,而且,进程里有很多系统DLL和第三方模块是你无法控制的,understand?


IP 地址: 已记录   报告
   2014-07-22, 15:14 下午
zhangrick 离线,最后访问时间: 2014/7/22 7:12:24 zhangrick

无等级
注册: 2014-07-22
发 贴: 1
Re: 什么样的情况会导致EXE会加载2份MSVCRT模块!!
Reply Quote
那最后怎样解决的?如何保证一个进程只加载一份crt
IP 地址: 已记录   报告
   2014-08-19, 10:54 上午
pianoid 离线,最后访问时间: 2023/7/27 7:59:05 pianoid

发帖数前100位
注册: 2011-05-19
发 贴: 11
Re: 什么样的情况会导致EXE会加载2份MSVCRT模块!!
Reply Quote
显然是无法保证的,但可以规避A堆申请B堆释放的bug,那就是永远永远不要跨模块传递非POD数据类型,特别是STL对象。
IP 地址: 已记录   报告
高端调试 » 软件调试 » C/C++本地代码调试 » Re: 什么样的情况会导致EXE会加载2份MSVCRT模块!!

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