我知道我可以使用汇编浏览器(例如ILSpy
)打开DLL文件,以查看它包含的类和方法。但是如果进程当前正在使用DLL,是否可以知道它当前使用的是什么方法?还有其他任何细节,例如它所在的确切行,以及它是否引发了异常?
这个问题并非针对特定语言,但我最感兴趣的是在C#中这样做。 DLL是在.NET框架中编译的。
我的目标是构建一个记录器,显示进程正在使用的代码的哪一部分,以及它是否引发异常,它来自哪个函数。
答案 0 :(得分:1)
我最接近的方法是检查进程的callstack。使用ProcessExplorer很容易做到这一点(在此处获取:https://technet.microsoft.com/en-gb/sysinternals/bb896653.aspx)
然后:
你应该得到这样的东西:
请注意,如果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扩展