我一直认为自己在捕获转储方面有相当的经验,但这个让我很困惑。我有一个.net进程,它会定期崩溃...我不知道它是什么崩溃,无论是在本机代码还是托管代码中崩溃,甚至是进程本身是否触及异常或第三方DLL。我所知道的是,它正在崩溃。我试图使用procdump来获取崩溃的转储,但我真的很挣扎。我将procdump设置如下:
procdump processname.exe -ma -e
问题是,在执行此操作的几分钟内,procdump将生成转储并退出...即使进程从未实际崩溃。如果我添加-g,我仍然得到相同的结果......几分钟后,procdump将生成转储并退出。如果我再次启动它,同样的事情就会发生。我打开了它生成的一些转储,但它们没有任何本机异常上下文。所以,我为所有托管线程抛出了所有托管的callstack,并且(到目前为止我检查过的所有转储)我发现了类似于这个callstack的东西:
SignIn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String Phone=LoginUname.getText().toString();
String Password=LoginPass.getText().toString();
new AsyncTask(){
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
Log.d("LOGIN FRAGMENT","Result: "+result); //GETTING RESULT FAIL HERE
if (result.equals("FAIL")){
Log.d("LOGIN FRAGMENT","Result is FAIL"); //THIS LOG SHOWING IN LOGCAT BUT TOAST IS NOT VISIBLE
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
Toast.makeText(getActivity(), "Invalid Login And Password", Toast.LENGTH_LONG).show();
}
});
}
else if (result.equals("SUCCESS")){
Log.d("LOGIN FRAGMENT","Result is Success");
}
}
}.execute();
Log.d("LOGIN FRAGMENT","----LOGIN AND PASSWORD SENT");
}
});
我认为这个Unhandled异常是导致procdump生成转储文件的原因。我做了一些搜索,发现了UnhandledExceptionEventHandler对象。所以我想这个过程必须有一些东西来捕获未处理的异常。或者这只是标准的SEH东西?
无论哪种方式,我都不关心这些未处理的异常,我只关心造成崩溃的异常。有什么办法可以告诉procdump只在致命异常上创建转储吗?我不认为-t会工作,因为这不会捕获异常,只会在进程正常终止时转储。我唯一的选择是转向其他类似DebugDiag的东西吗?
提前感谢任何建议
答案 0 :(得分:0)
您实际上是告诉ProcDump自己转储未处理的异常。
-e当进程遇到未处理的异常时写入转储。包含1以在第一次机会异常时创建转储。
引用from here。
只需将其删除,您就不会在未处理的例外情况下获得转储:
procdump processname.exe -ma