【问题标题】:application exits (no Exception) when referencing 64bit dll from C#从 C# 引用 64 位 dll 时应用程序退出(无异常)
【发布时间】:2011-11-23 11:52:51
【问题描述】:

我有 compiled lzo2.dll 64 bit,现在希望在 C# 程序中使用它:

我正在使用以下类进行测试(类似代码适用于 32 位 lzo.dll):

[DllImport("lzo2.dll")]
private static extern string lzo_version_string();
static void Main(string[] args)
{
    try
    {
        if (Environment.Is64BitProcess)
        {
            Console.WriteLine(lzo_version_string());//application exits here, no exceptions caught 
        }                
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
    }
    Console.ReadLine();
}

此时表明应用程序崩溃了,所以我退出了windbg,这是它的输出:(抱歉冗长)

0:000> !analyze -v
*******************************************************************************
*                                                                             *
*                        Exception Analysis                                   *
*                                                                             *
*******************************************************************************

*** WARNING: Unable to verify checksum for C:\Windows\assembly\NativeImages_v4.0.30319_64\mscorlib\e0e5fbe72e8813a135fc878ff32b4bee\mscorlib.ni.dll
*** WARNING: Unable to verify checksum for Lzo64.exe
GetPageUrlData failed, server returned HTTP status 404
URL requested: http://watson.microsoft.com/StageOne/Lzo64_exe/1_0_0_0/4eccdc93/ntdll_dll/6_1_7601_17514/4ce7c8f9/80000003/000c40bf.htm?Retriage=1

FAULTING_IP: 
ntdll!RtlReportCriticalFailure+2f
00000000`77a240bf cc              int     3

EXCEPTION_RECORD:  ffffffffffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 0000000077a240bf (ntdll!RtlReportCriticalFailure+0x000000000000002f)
   ExceptionCode: 80000003 (Break instruction exception)
  ExceptionFlags: 00000000
NumberParameters: 1
   Parameter[0]: 0000000000000000

FAULTING_THREAD:  0000000000001c90

PROCESS_NAME:  Lzo64.exe

ERROR_CODE: (NTSTATUS) 0x80000003 - {EXCEPTION}  Breakpoint  A breakpoint has been reached.

EXCEPTION_CODE: (HRESULT) 0x80000003 (2147483651) - One or more arguments are invalid

EXCEPTION_PARAMETER1:  0000000000000000

MOD_LIST: <ANALYSIS/>

NTGLOBALFLAG:  70

APPLICATION_VERIFIER_FLAGS:  0

MANAGED_STACK: 
(TransitionMU)
000000000054E670 000007FEF1F3BF6C mscorlib_ni!System.StubHelpers.CSTRMarshaler.ClearNative(IntPtr)+0x3c
000000000054E730 000007FF00140319 Lzo64!DomainBoundILStubClass.IL_STUB_PInvoke()+0x14031a
000000000054E840 000007FF00140181 Lzo64!Lzo64.Program.Main(System.String[])+0x61
(TransitionUM)

MANAGED_STACK_COMMAND:  _EFN_StackTrace

LAST_CONTROL_TRANSFER:  from 0000000077a24736 to 0000000077a240bf

BUGCHECK_STR:  APPLICATION_FAULT_WRONG_SYMBOLS_CALL

PRIMARY_PROBLEM_CLASS:  WRONG_SYMBOLS_CALL

DEFAULT_BUCKET_ID:  WRONG_SYMBOLS_CALL

STACK_TEXT:  
00000000`0054e3d0 00000000`77a24736 : 00000000`00000002 00000000`00000023 00000000`0054e6a8 00000000`00000003 : ntdll!RtlReportCriticalFailure+0x2f
00000000`0054e4a0 00000000`77a25942 : 000007fe`f1533de8 000007fe`f1533de8 00000000`0054ea10 00000000`0054e8a8 : ntdll!RtlpReportHeapFailure+0x26
00000000`0054e4d0 00000000`77a275f4 : 00000000`005d0000 00000000`00000000 00000000`00000000 00000000`0064e560 : ntdll!RtlpHeapHandleError+0x12
00000000`0054e500 00000000`779cdcb7 : 000007fe`faab7b68 00000000`005d0000 000007fe`faab7b68 000007fe`f2d85000 : ntdll!RtlpLogHeapFailure+0xa4
00000000`0054e530 000007fe`fe3e8e56 : 00000000`0054e900 000007fe`faab7b68 00000000`f2734dd5 00000000`00000000 : ntdll! ?? ::FNODOBFM::`string'+0x10c7c
00000000`0054e5b0 000007fe`f27319c2 : 000007fe`faab7b68 0000a965`d9ebab11 000007fe`faab7b68 00000000`00000004 : ole32!CoTaskMemFree+0x36
00000000`0054e5e0 000007fe`f1f3bf6c : 000007fe`faab7b68 00000000`0054ea10 0000a965`d9ebab11 000007fe`f2dbd2c0 : clr!DoNDirectCallWorker+0x62
00000000`0054e670 000007ff`00140319 : 00000000`00000000 000007ff`000240f0 00000000`0054ea10 00000000`0054e8a8 : mscorlib_ni+0xa8bf6c
00000000`0054e730 000007ff`00140181 : 00000000`00000001 00000000`0054eaa0 00000000`0054e900 000007fe`f2734dd5 : 0x7ff`00140319
00000000`0054e840 000007fe`f2759714 : 00000000`02c31a58 00000000`0054eaa0 00000000`0054e900 000007fe`f2734dd5 : 0x7ff`00140181
00000000`0054e8a0 000007fe`f2759829 : 000007ff`00024138 00000000`00000001 00000000`00000000 00000000`00000000 : clr!CallDescrWorker+0x84
00000000`0054e8f0 000007fe`f27598a5 : 00000000`0054ea08 00000000`00000001 00000000`0054ea10 00000000`0054ebf0 : clr!CallDescrWorkerWithHandler+0xa9
00000000`0054e970 000007fe`f28f6651 : 00000000`00000000 00000000`0054ebf8 00000000`00000001 000007fe`f14b1a32 : clr!MethodDesc::CallDescr+0x2a1
00000000`0054eba0 000007fe`f28f6788 : 00000000`0064e560 00000000`0064e560 00000000`00000000 00000000`00000000 : clr!ClassLoader::RunMain+0x228
00000000`0054edf0 000007fe`f28f653e : 00000000`0054f3f0 00000000`00000200 00000000`0065afa0 00000000`00000200 : clr!Assembly::ExecuteMainMethod+0xac
00000000`0054f0a0 000007fe`f2915e56 : 00000000`00000000 00000000`01280000 00000000`00000000 00000000`00000000 : clr!SystemDomain::ExecuteMainMethod+0x452
00000000`0054f650 000007fe`f2915d73 : 00000000`01280000 00000000`00000000 00000000`00000000 00000000`00000000 : clr!ExecuteEXE+0x43
00000000`0054f6b0 000007fe`f2906c6d : 00000000`0064e560 ffffffff`ffffffff 00000000`00000000 00000000`00000000 : clr!CorExeMainInternal+0xc4
00000000`0054f720 000007fe`f9d03309 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`0054f708 : clr!CorExeMain+0x15
00000000`0054f760 000007fe`f9e15b21 : 000007fe`f2906c58 000007fe`f9d032c0 00000000`00000000 00000000`00000000 : mscoreei!CorExeMain+0x41
00000000`0054f790 00000000`773f652d : 000007fe`f9d00000 00000000`00000000 00000000`00000000 00000000`00000000 : MSCOREE!CorExeMain_Exported+0x57
00000000`0054f7c0 00000000`7798c521 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : KERNEL32!BaseThreadInitThunk+0xd
00000000`0054f7f0 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!RtlUserThreadStart+0x1d


STACK_COMMAND:  .cxr 0000000000000000 ; kb ; dt ntdll!LdrpLastDllInitializer BaseDllName ; dt ntdll!LdrpFailureData ; ~0s ; kb

FOLLOWUP_IP: 
clr!DoNDirectCallWorker+62
000007fe`f27319c2 41c744240c01000000 mov   dword ptr [r12+0Ch],1

SYMBOL_STACK_INDEX:  6

SYMBOL_NAME:  clr!DoNDirectCallWorker+62

FOLLOWUP_NAME:  MachineOwner

MODULE_NAME: clr

IMAGE_NAME:  clr.dll

DEBUG_FLR_IMAGE_TIMESTAMP:  4e1822f4

FAILURE_BUCKET_ID:  WRONG_SYMBOLS_CALL_80000003_clr.dll!DoNDirectCallWorker

BUCKET_ID:  X64_APPLICATION_FAULT_WRONG_SYMBOLS_CALL_clr!DoNDirectCallWorker+62

WATSON_STAGEONE_URL:  http://watson.microsoft.com/StageOne/Lzo64_exe/1_0_0_0/4eccdc93/ntdll_dll/6_1_7601_17514/4ce7c8f9/80000003/000c40bf.htm?Retriage=1

Followup: MachineOwner
---------

我看过这个,但仍然无法确定问题所在。我相信即使堆栈跟踪看起来确实有名称并因此提供了一些含义,它也会抱怨这些符号。有人可以暗示可能是什么问题或指出下一步的方向吗?

它在 CFF Explorer 和 Dependency Walker 中打开正常。

没有似乎 lzo2.dll 本身存在问题,因为作为构建过程的一部分提供的测试应用程序 (lzotest.exe -mlzo COPYING) 通过了。

【问题讨论】:

  • 引用 32 位版本的 crt 的 64 位 dll 确实看起来是错误的,并且几乎肯定会阻止它加载
  • 那是构建过程的问题吗?我还尝试重新安装了 x64 版本的 c++ Redistributable 包并重新编译 lzo 没有成功
  • 构建过程可能没问题(除非您完全搞砸了 VS 设置,否则它无法生成链接到 32 位 crt 的 64 位 dll)。我的猜测是 Dependency Walker 只是找不到相应的 MSVCR100.dll,因此不知道它是 64 位的,因此不会在其上显示 '64' 数字。您的系统路径可能有问题(lzo 工具是否运行?)。同样,重新安装 redist 也永远无法解决此问题,如果您正确安装了 VS,则不需要单独使用 redist:否则您将无法运行 VS 创建的任何 exe。
  • 是的,你是对的,Dependency walker 显示的信息不正确,因为我使用的是 32 位版本,64 位版本看起来还可以。我正在从问题中删除图像

标签: c# c++ windbg dump


【解决方案1】:

没有堆栈跟踪,但我可以猜到,你会在某处看到 CoTaskMemFree()。这是 pinvoke marshaller 调用以释放函数返回的字符串缓冲区的内容。问题是,字符串缓冲区不是由 CoTaskMemAlloc() 分配的。 Vista 和 Windows 7 有一个更严格的内存管理器,它们不允许程序释放它没有分配的内存。它适用于 XP,它只是忽略了错误的缓冲区指针。

返回字符串的 C 函数是一个内存管理问题。然而,它可能在这种特定情况下工作,它可能返回一个不需要释放的字符串文字。您必须阻止编组器尝试释放字符串,像这样声明函数:

[DllImport("lzo2.dll")]
private static extern IntPtr lzo_version_string();

并像这样使用它:

IntPtr strPtr = lzo_version_string();
string version = Marshal.PtrToStringAnsi(strPtr);

【讨论】:

  • 汉斯,谢谢,修复了它,并感谢详细的解释。只是为了澄清一下,当您说“没有堆栈跟踪”时,windbg 中似乎有一个具有有意义名称的堆栈。缺少什么让您说没有堆栈? (是的,CoTaskMemFree 在堆栈跟踪中)
猜你喜欢
  • 1970-01-01
  • 2012-12-17
  • 1970-01-01
  • 2018-05-14
  • 1970-01-01
  • 2017-07-13
  • 2011-09-14
  • 2013-04-11
  • 1970-01-01
相关资源
最近更新 更多