我有一个问题,我们的应用程序挂在客户的机器上,我已经连续几天没有解决.这个问题从我们所看到的情况中随机出现,尽管这可能不是真实的情况.客户还报告应用程序挂起时CPU正在达到峰值.
问题是我不知道应用程序在哪里失败(挂起).我们有几个用C#编写的插件作为主COM应用程序的插件.
我设法让客户在发生问题的机器上使用带有ProcExp的MiniDump.但是,就此而言,我对WinDBG或MiniDumps不是很熟悉.我已经运行!analyze -v和!analyze -v -hang,产生一些输出,包括下面的堆栈.对于我能够分辨的内容,似乎应用程序正在转换到我们的一个C#插件(CLR),然后再转回到COM,它应该是一个返回插件可用的主应用程序的接口.但那又怎样?是否可以从这个堆栈中说出更多内容?
如果重要的话,主要的应用程序是用VB6编写的.
0012da70 7e3693e9 7e3693a8 0012daf0 00000000 ntdll!KiFastSystemCallRet
0012da9c 7e37a43b 0012daf0 00000000 0000000f user32!NtUserPeekMessage+0xc
0012dac8 7348e6fd 0012daf0 00000000 0000000f user32!PeekMessageA+0xeb
0012db1c 77532a9c 00d03774 00000000 00000000 msvbvm60!CMsgFilter::MessagePending+0x21f
0012db60 77532a48 00000102 0012dbec 00000001 ole32!CCliModalLoop::HandlePendingMessage+0x40
0012dba8 7751eda6 80010116 80010115 00000000 ole32!CCliModalLoop::HandleWakeForMsg+0x46
0012dbbc 77547297 0012ddf0 00000001 0012dbe8 ole32!CCliModalLoop::BlockFn+0x8b
0012dc30 0ae8a2fd 00000002 00000001 00000001 ole32!CoWaitForMultipleHandles+0xcf
0012dc50 0ae8a264 00000000 00000001 00000001 mscorwks!NT5WaitRoutine+0x51
0012dcbc 0ae8a1c8 00000001 0012ddf0 00000000 mscorwks!MsgWaitHelper+0xa5
0012dcdc 0af3ccd0 00000001 0012ddf0 00000000 mscorwks!Thread::DoAppropriateAptStateWait+0x28
0012dd60 0af3cd65 00000001 …Run Code Online (Sandbox Code Playgroud) 我有一个场景,我有多个IObservable序列,我想结合,Merge然后听.但是,如果其中一个产生错误,我不希望它崩溃其他流的所有内容,以及重新订阅序列(这是一个'永久'序列).
我这样做是通过Retry()在合并之前向流附加一个,即:
IEnumerable<IObservable<int>> observables = GetObservables();
observables
.Select(o => o.Retry())
.Merge()
.Subscribe(/* Do subscription stuff */);
Run Code Online (Sandbox Code Playgroud)
但是,当我想测试时会出现问题.我想测试的是,如果其中一个IObservables observables产生一个OnError,其他的应该仍然能够发送它们的值,它们应该被处理
我以为我只用两个Subject<int>s代表两个IObservables observables; 发送一个OnError(new Exception())和另一个,然后发送OnNext(1).但是,它似乎Subject<int>将重播新订阅的所有先前值(实际上Retry()是这样),将测试变为无限循环.
我尝试通过创建一个手册来解决它,该手册IObservable在第一个订阅上产生错误,然后是一个空序列,但它感觉很hacky:
var i = 0;
var nErrors = 2;
var testErrorObservableWithOneErrorAndThenCompletion = Observable.Create<int>(o => {
i++;
if (i < nErrors) {
return Observable.Throw<int>(new Exception()).Subscribe(o);
} else {
return Observable.Empty<int>().Subscribe(o);
}
}); …Run Code Online (Sandbox Code Playgroud) 来自操作员的文档TakeUntil(强调我的):
TakeUntil 订阅并开始镜像源 Observable。它还监视您提供的第二个 Observable。如果第二个 Observable 发出一个项目或发送终止通知,则 TakeUntil 返回的 Observable 停止镜像源 Observable并终止。
如果这是真的,那么为什么会阻止?:
Observable.Never<Unit>()
.TakeUntil(Observable.Empty<Unit>())
.Wait();
Run Code Online (Sandbox Code Playgroud)