windbg - 条件断点在windbg中不起作用
问题描述
我有以下 C++ 代码
int myvar=1;
void test1( int j)
{
int b=j+1;
}
void main()
{
myvar=2;
test1(50);
myvar=3;
test1(100);
myvar=6;
test1(200);
}
我正在尝试设置一个断点,如果在运行函数 test1 时 myvar 大于 4,则该断点停止。
这是我的断点:
bp test!test1 ".if ( poi(myvar)>0n4) {} .else {gc} "
但是,每次执行 test1 时它都会停止……可执行文件名为 test.exe,它是一个 64 位应用程序。任何建议将不胜感激。
解决方案
断点中的一点调试揭示了正在发生的事情:
0 e Disable Clear 00007ff6`77e11410 [f:\projects\windbg_help\main.cpp @ 4] 0001 (0001) 0:**** windbg_help!test1 "?? myvar; r $t1=myvar; ?? @$t1; r $t2=poi(myvar); ?? @$t2; .if (dwo(myvar) > 0n4) {.echo yes; gc} .else {.echo no; gc} "
我将 t1 临时寄存器设置为 myvar,并将 t2 临时寄存器设置为 myvar 的内容,然后显示它们:
0:000> g
int 0n2
unsigned int64 0x00007ff6`77e1c000
unsigned int64 0xffffffff`00000002
no
int 0n3
unsigned int64 0x00007ff6`77e1c000
unsigned int64 0xffffffff`00000003
no
int 0n6
unsigned int64 0x00007ff6`77e1c000
unsigned int64 0xffffffff`00000006
yes
ModLoad: 00007ff9`c8520000 00007ff9`c8531000 C:\WINDOWS\System32\kernel.appcore.dll
ModLoad: 00007ff9`c9da0000 00007ff9`c9e3e000 C:\WINDOWS\System32\msvcrt.dll
ModLoad: 00007ff9`c9aa0000 00007ff9`c9bc2000 C:\WINDOWS\System32\RPCRT4.dll
ntdll!NtTerminateProcess+0x14:
00007ff9`cc5cfcd4 c3 ret
注意 poi(myvar) 如何返回一个 64 位的值,并且设置了高 32 位。你 poi(myvar) > 0n4 比较是说:
if (0xffffffff0000000? > 4) then { always true }
改为使用 dwo(myvar) 仅读取 32 位内容
推荐阅读
- database - 如何与 Python 一起实现 Web 应用程序
- angular - Angular6:如何在一行中使用 HttpParams 设置和传递参数?
- c - 如何使用 atmega328p 从 dht11 读取数据
- mysql - 如何在一定条件下使用mysql中的子查询从不同的表中调用列
- javascript - 下拉列表在网格中显示为未定义
- node.js - 从另一个文件(Node.js)中的子对话框获取 Luis“topIntent”
- html - Stylesheet for single object
- excel - 基于相同的多个单元格值返回多个标题名称
- excel - 多列表选择第一个选定的值并存储
- java - 如何根据某些参数动态生成弹性搜索查询