首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sosex.mbm:设置命令参数

sosex.mbm:设置命令参数
EN

Stack Overflow用户
提问于 2014-08-11 15:11:13
回答 1查看 260关注 0票数 0

我经常需要在方法上设置断点,打印参数,并在特定参数上中断,或者在不匹配时继续。在本机代码中,我将使用bp <symbol> "commands"。但是这是一个托管应用程序,所以这个方法并不总是JITted。因此,!sos.bpmd是可用的;但是,它不支持命令参数。!sosex.mbm是另一个选项,文档表明它可以接受命令参数。来自!sosex.help mbm

“命令”--可以指定一个引用的字符串参数。此字符串的内容将作为命令参数传递到相应的本机断点。 有关这些选项的详细信息,请参阅“bp”命令的调试器文档。

其含义是,它将此命令参数传递给本机断点命令,如bp。但是,它不能解析同一个bp命令能够接受的命令参数。

下面是我的尝试。

代码语言:javascript
复制
0:022> $ Set a breakpoint on Foo.Bar.CBase!Foo.Bar.CBase.set_Item.
0:022> !sosex.mbm Foo.Bar.CBase!Foo.Bar.CBase.set_Item
The breakpoint could not be resolved immediately.
Further attempts will be made as modules are loaded.
Breakpoint set at Foo.Bar.CBase.set_Item(System.String, System.Object) in AppDomain 0000000001f32cc0.
0:022> $ Breakpoint set. Check the native address.
0:022> !sosex.mbl
AppDomain 0000000001eceee0
--------------------------
0 eu: disable Foo.Bar.CBase!Foo.Bar.CBase.SET_ITEM ILOffset=0: pass=1 oneshot=false thread=ANY

AppDomain 0000000001f32cc0
--------------------------
0 e : disable Foo.Bar.CBase!Foo.Bar.CBase.SET_ITEM ILOffset=0: pass=1 oneshot=false thread=ANY
    Foo.Bar.CBase!Foo.Bar.CBase.set_Item(string, object)
        0 e 000007ff005cc799

0:022> $ Clear the breakpoint.
0:022> $ !sosex.mbc 0
0:022> $ Set breakpoint on same address with command argument.
0:022> bp 000007ff005cc799 "as /mu ${/v:col} (@rdx+0x10); .block { .printf \"Column: %mu, Value: %mu\\n\", @rdx+10, @r8+10; .if (0 != $scmp( \"${col}\", \"opt_id\")) { gc } }"

0:022> $ Check the set breakpoint.
0:022> bl
 0 e 000007ff`005cc799     0001 (0001)  0:****  "as /mu ${/v:col} (@rdx+0x10); .block { .printf \"Column: %mu, Value: %mu\\n\", @rdx+10, @r8+10; .if (0 != $scmp( \"${col}\", \"opt_id\")) { gc } }"

0:022> $ Continue execution. 
0:022> g
Column: abc_id, Value: 80
Column: hoge_id, Value: N
Column: priority, Value: 
Column: opt_id, Value: ZEI
000007ff`005cc799 488b542430      mov     rdx,qword ptr [rsp+30h] ss:00000000`056cae00=000000013f7ed498
0:022> $ Outputs arguments and continues on non-match. Breaks on match. Expected results.

命令参数似乎是有效的,并按我的意愿执行。这样的断点是一个常见的任务,所以我更喜欢用一个命令来设置整个事件,而不是完成上述多个步骤。从sosex.mbm文档中可以确定,我应该能够执行以下操作:

代码语言:javascript
复制
0:022> $ Cleanup. Clear the breakpoint.
0:022> bc 0
0:022> $ Ensure that the alias is not defined.
0:022> ad /q ${/v:col}
0:022> $ Try to set the same breakpoint with sosex.mbm.
0:022> !sosex.mbm Foo.Bar.CBase!Foo.Bar.CBase.set_Item "as /mu ${/v:col} (@rdx+0x10); .block { .printf \"Column: %mu, Value: %mu\\n\", @rdx+10, @r8+10; .if (0 != $scmp( \"${col}\", \"opt_id\")) { gc } }"
syntax error
               ^ Quotes required in ' .printf \"Column: %mu, Value: %mu\\n\", @rdx+10, @r8+10; .if (0 != $scmp( \"${col}\", \"opt_id\")) { gc } '

它失败了,指示需要引号,但我无法确定在哪里。语法有点复杂,所以让我们尝试一些更简单的方法:

代码语言:javascript
复制
0:022> $ Output RDX and R8 when the breakpoint is hit.
0:022> !sosex.mbm Foo.Bar.CBase!Foo.Bar.CBase.set_Item "r @rdx; r @r8"
syntax error
                                                                        ^ Syntax error in '!sosex.mbm Foo.Bar.CBase!Foo.Bar.CBase.set_Item "r @rdx; r @r8"'

这一次是语法错误,但我仍然无法确定位置。再试一次吧。

代码语言:javascript
复制
0:022> $ Output RDX when the breakpoint is hit, and then continue.
0:022> !sosex.mbm Foo.Bar.CBase!Foo.Bar.CBase.set_Item "r @rdx; gc"
syntax error
                                                                      ^ Extra character error in '!sosex.mbm Foo.Bar.CBase!Foo.Bar.CBase.set_Item "r @rdx; gc"'

另一个错误,但这次是关于一个额外的角色,但在我看来还可以。让我们尝试一些更容易的事情。

代码语言:javascript
复制
0:022> $ Output RDX when the breakpoint is hit.
0:022> !sosex.mbm Foo.Bar.CBase!Foo.Bar.CBase.set_Item "r @rdx"
The breakpoint could not be resolved immediately.
Further attempts will be made as modules are loaded.
Breakpoint set at Foo.Bar.CBase.set_Item(System.String, System.Object) in AppDomain 0000000001f32cc0.

终于成功了。我由此得出的结论是,sosex.mbm只能接受一个命令参数,只要它不包含多个语句。如文档所示,如果仅将单个命令参数传递给本机断点(如bp),则不应该存在这种限制。

这种行为是被期望的还是我做错了什么?还有别的方法可以做到这一点吗?我可以使用上面的解决方法,但是我经常需要设置这样的断点,所以我更愿意找到一种更直接的方法来实现这一点。

请注意,我使用的是4.5.0.783版的sosex。这是可供下载的最新版本。

EN

回答 1

Stack Overflow用户

发布于 2014-08-11 20:48:12

你没做错什么。我明白为什么嵌入引号的命令会失败。对于解析引用的字符串,SOSEX并不是非常复杂。但是,您的简单命令应该成功。我会努力解决这个问题,然后再联系你。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25246584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档