我的调试版本dll使用可再发行版本和崩溃的发行版本

时间:2016-01-05 15:10:55

标签: c++ windows visual-studio-2010

我在msvcr100.dll中发生崩溃,仅在调试中发生。我怀疑发布/调试差异。我不明白为什么这个dll作为依赖于此可再发行版本的发布版本(而其他dll编译方式与此相同)

这是程序崩溃时的堆栈

ntdll.dll!_RtlpWaitOnCriticalSection@8()               Unknown
ntdll.dll!_RtlEnterCriticalSection@4()      Unknown
msvcr100.dll!_lock_file(_iobuf * pf) Line 236       C
bard.dll!std::basic_filebuf<char,std::char_traits<char> >::_Lock() Line 310       C++
bard.dll!std::basic_istream<char,std::char_traits<char> >::_Sentry_base::_Sentry_base(std::basic_istream<char,std::char_traits<char> > & _Istr) Line 78            C++
bard.dll!std::basic_istream<char,std::char_traits<char> >::sentry::sentry(std::basic_istream<char,std::char_traits<char> > & _Istr, bool _Noskip) Line 99              C++
bard.dll!std::getline<char,std::char_traits<char>,std::allocator<char>

我使用visual studio 2010编译,项目使用poco 1.4.1

以前调试版本运行正常,msvcr100.dll没有不必要的依赖。自那以后,构建过程发生了很大的变化,我真的不知道在哪里看。什么会导致这类问题?

根据依赖墙,依赖是直接的,当我通过调试运行程序指向这些函数时:

GetProcAddress(0x75770000 [KERNEL32.DLL], "FlsAlloc") called from "MSVCR100.DLL" at address 0x71FABA3B and returned 0x75784EE3.
GetProcAddress(0x75770000 [KERNEL32.DLL], "FlsGetValue") called from "MSVCR100.DLL" at address 0x71FABA48 and returned 0x75781252.
GetProcAddress(0x75770000 [KERNEL32.DLL], "FlsSetValue") called from "MSVCR100.DLL" at address 0x71FABA55 and returned 0x757841C0.
GetProcAddress(0x75770000 [KERNEL32.DLL], "FlsFree") called from "MSVCR100.DLL" at address 0x71FABA62 and returned 0x7578354F.

当查看预处理器的相应输出时,我看到:

#line 6193 "C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v7.0A\\include\\winbase.h"

[...]

__declspec(dllimport)
DWORD
__stdcall
FlsAlloc(
     PFLS_CALLBACK_FUNCTION lpCallback
    );

__declspec(dllimport)
PVOID
__stdcall
FlsGetValue(
     DWORD dwFlsIndex
    );

__declspec(dllimport)
BOOL
__stdcall
FlsSetValue(
         DWORD dwFlsIndex,
     PVOID lpFlsData
    );

__declspec(dllimport)
BOOL
__stdcall
FlsFree(
     DWORD dwFlsIndex
    );  

2 个答案:

答案 0 :(得分:1)

在Visual Studio中,转到Property Pages-->C/C++-->Code Generation-->Runtime Library并确保它是&#34;多线程调试DLL&#34;而不是&#34;多线程DLL&#34;。或者,如果从命令行构建,则应包括/ MDd而不是/ MD标志。

答案 1 :(得分:0)

如果您不知道,可以使用(优秀)软件http://www.dependencywalker.com/来找出二进制文件的依赖关系。您将很容易看到调试的来源,并帮助您找出问题所在。