【问题标题】:WinDbg conditional breakpoint after .NET GC.NET GC 后的 WinDbg 条件断点
【发布时间】:2020-04-23 09:36:00
【问题描述】:

我在 GC 循环结束时设置条件断点。
程序会中断,但它无法评估 GcCondemnedGeneration 变量,因此程序会在每次 GC 循环时中断,而不管收集的实际代数如何。

这是断点命令:

> bp clr!ThreadSuspend::RestartEE ".if @@(clr!SVR::GCHeap::GcCondemnedGeneration==2) {kb} .else {g}"

这是我在断点中断时得到的:

Type information missing error for SVR::GCHeap::GcCondemnedGeneration
Couldn't resolve error at 'clr!SVR::GCHeap::GcCondemnedGeneration==2) {kb} .else {g}'
clr!ThreadSuspend::RestartEE:
00007fff`145d5dfc 488bc4          mov     rax,rsp

我尝试了各种变体,但都失败了。
机器上安装的.Net版本是4.6.1。
我的程序使用服务器 gc 运行。
clr.dll 符号加载成功。

谢谢

【问题讨论】:

  • 你想达到什么目的? GC 结束时你想要一个本地调用栈吗?这有什么用?
  • 虽然我能够让它工作,但我很想看到@ThomasWeller 问题的答案!
  • 我对调用堆栈并不感兴趣,我有兴趣在 GC gen2 之后立即转储 Gen2。我在问题中使用的 kb 只是为了简单起见。

标签: .net garbage-collection windbg conditional-breakpoint


【解决方案1】:

我能够在不使用 C++ 表达式语法和仅 MASM 表达式的情况下使其工作(其中 dwo 用于取消引用 DWORD 大小的数据,例如 unsigned int):

bp clr!ThreadSuspend::RestartEE ".if (poi(clr!SVR::GCHeap::GcCondemnedGeneration)==2) {kb} .else {g}"

【讨论】:

  • 感谢 Konrad,变量是 'unsigned int' 那么为什么要使用 poi?当我删除 @@ 并使用 dwo 时,它起作用了。 ?poi(clr!SVR::GCHeap::GcCondemnedGeneration) 给出 4294967298 = 0000000100000002 而 ?dwo(clr!SVR::GCHeap::GcCondemnedGeneration) 给出 2 = 0000000000000002
  • 对,对不起,我的错!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多