查看DLL当前使用的方法

时间:2015-07-24 22:06:25

标签: c# dll .net-assembly

我知道我可以使用汇编浏览器(例如ILSpy)打开DLL文件,以查看它包含的类和方法。但是如果进程当前正在使用DLL,是否可以知道它当前使用的是什么方法?还有其他任何细节,例如它所在的确切行,以及它是否引发了异常?

这个问题并非针对特定语言,但我最感兴趣的是在C#中这样做。 DLL是在.NET框架中编译的。

我的目标是构建一个记录器,显示进程正在使用的代码的哪一部分,以及它是否引发异常,它来自哪个函数。

2 个答案:

答案 0 :(得分:1)

我最接近的方法是检查进程的callstack。使用ProcessExplorer很容易做到这一点(在此处获取:https://technet.microsoft.com/en-gb/sysinternals/bb896653.aspx

然后:

  1. 打开Process Explorer,选择您需要更多信息的流程 关于,然后右键单击> 属性 ...
  2. 选择' 主题'标签。这将打开此进程的所有线程列表。
  3. 选择您感兴趣的主题,然后点击' 堆叠'这将显示加载的DLL列表和名为
  4. 的方法

    你应该得到这样的东西:

    enter image description here

    请注意,如果PE可以解析符号,则上述操作会起作用。此页面提供了有关如何在Process Explorer中启用符号解析的示例:http://windowsexplored.com/2012/01/31/resolve-symbols-in-process-explorer-monitor-without-installing-the-debugging-tools/

答案 1 :(得分:1)

1.一个简单的方法是添加到Main()函数

 AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

和处理程序将类似

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
   string errorMessage = e.ExceptionObject.ToString();
   Logger.Error(e.ExceptionObject.ToString());
   Current.Shutdown(1);
}

2.您可以使用带有标记“-e”的ProcDump来捕获未处理的异常。

例如myApp.exe:

Procdump -ma -e -w myApp.exe C:\temp\fe.dmp

然后你需要为winDB加载一些东西
1。将转储文件加载到WinDBG中
2。 winDBG中的.loadby sos clr
3。 !printexception

0:005> !printexception 
Exception object: 0000000002becc68 
Exception type:   System.NullReferenceException 
Message:          Object reference not set to an instance of an object. 
InnerException:   <none> 
StackTrace (generated):     
SP               IP               Function     
000000001B94F190 000007FF7E551B74 myApp!myApp.MainForm+...     
000000001B94F220 000007F8010FFD85 mscorlib_ni!System.Threading...     
000000001B94F380 000007F8010FFAE9 mscorlib_ni!System.Threading...     
000000001B94F3B0 000007F8010AC31F mscorlib_ni!System.Threading...     
000000001B94F400 000007F8010AC92A mscorlib_ni!System.Threading... ...  

你可能还需要SOSEX扩展