Procdump -e在非致命异常上创建转储

时间:2016-08-23 08:50:20

标签: c# .net seh procdump

我一直认为自己在捕获转储方面有相当的经验,但这个让我很困惑。我有一个.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的东西吗?

提前感谢任何建议

1 个答案:

答案 0 :(得分:0)

您实际上是告诉ProcDump自己转储未处理的异常。

  

-e当进程遇到未处理的异常时写入转储。包含1以在第一次机会异常时创建转储。

引用from here

只需将其删除,您就不会在未处理的例外情况下获得转储:

procdump processname.exe -ma