Windows Hata Raporlaması'ndan elde edilen dökümler, genellikle WerpReportFault
numaralı bir yığında derin bir yığınla birlikte, hata iş parçacığı üzerinde kullanılan işe yaramaz bir geçerli içeriğe sahiptir. İstisna zamanındaki asıl içerik, .ecxr
ile geri alınabilir - aynı zamanda bağlamı, aynı iş parçacığı üzerinde (k
gibi) "doğru" bilgiyi döndürecek şekilde de ayarlar.Depolanmış özel durum içeriğinden yığın izlemesinin bir minidump içinde geri alınması (.ecxr; k'ye benzer)
Hatalı iş parçacığı kümesini elde etmek için IDebugControl::GetStackTrace
kullanan otomatik döküm analizi için bir araç hazırlıyorum. IDebugControl4::GetStoredEventInformation
kullanarak depolanmış istisna bağlamını alabilirim. EBP/RBP, ESP/RSP, EIP/RIP değerlerini saklanan içerikten GetStackTrace
ile kullanırsam, doğru yığını alırım. Ancak, .ecxr
komutunun, iş parçacığı olana kadar "doğru" durumu ayarlayarak ne yaptığını çoğaltmak isterim. IDebugAdvanced::SetThreadContext
kullanmayı denedim, ancak dökümü hedefler için geçersiz bir işlem gibi görünüyor ve 0x8000FFFF ile başarısız.
.ecxr
bir WinDbg örneği ayıklama yoluyla ne yaptığını anlamaya çalıştı ve
.ecxr
dbgeng!DotEcxr
uygulanan gibi görünüyor. Ancak, onu izlemeden (
wt
ile), geçerli iş parçacığının içeriğini nasıl sıfırladığını anlayamadım. Yine de, herhangi bir COM hata ayıklama-istemci arabirimi yöntemini çağırıyor gibi görünmüyor ve
IDebugAdvanced::SetThreadContext
kullanmıyor.
İş parçacığı içeriğini bir döküm dosyasında nasıl ayarlayacağınız konusunda herhangi bir öneri çok takdir edilecektir. Son çare olarak, her zaman IDebugControl::Execute
kullanabilir ve .ecxr
komutunu çağırırım, ancak daha programlı bir yaklaşım tercih ederim.
Harika. Tam olarak ihtiyacım olana benziyor. –