我们有内存覆盖问题.在某些时候,在我们的程序过程中,内存位置被覆盖并导致程序崩溃.问题仅在发布模式下发生.在调试时,一切都很好.这是一个经典的C/C++ bug,也是一个很难找到的bug.
我想知道是否有办法添加一些"调试代码"来监视这个内存位置,并在更改后调用回调.这基本上是调试器在调试模式下可以做的事情('数据断点'),但我们在发布时需要类似的东西.
我有这个功能:
public static FradId readFradId(DataInput pIn) throws IOException {
Integer lMainId = Integer.valueOf(pIn.readInt());
Integer lReferenceId = Integer.valueOf(pIn.readInt());
String lShortname = pIn.readUTF();
return new FradId(lMainId,lReferenceId,lShortname);
}
Run Code Online (Sandbox Code Playgroud)
我在这一行得到了一个断点:
String lShortname = pIn.readUTF();
Run Code Online (Sandbox Code Playgroud)
我的问题是在某些情况下函数readUTF抛出一个RuntimeException.应用程序执行该功能超过100次,因此我很难找到问题.
我的问题:有没有办法用断点条件捕获该异常?我已经在简单的布尔条件下使用了这些条件,但我不知道在抛出异常时如何在该行中停止.
Thx提前
斯特凡
是否可以创建断点,条件是递归过程的开始?换句话说,堆栈仅应调用该函数。
IE考虑以下工作流程:
主函数->调用递归函数->命中断点->继续->递归调用self->不要命中断点->继续递归。
我想基于一个参数的成员设置条件断点,现在我可以使用dt命令检查此参数,我的代码如下所示:
void test(const MyClassB &inst, int value)
{
}
Run Code Online (Sandbox Code Playgroud)
现在,我可以使用dt命令查看第一个参数,即结果:
0:000:x86> dt MyClassB @esp+4
dbgee!MyClassB
+0x000 id : (null)
+0x004 m : 0n2130567168
+0x008 myClassA : MyClassA
Run Code Online (Sandbox Code Playgroud)
现在,我想根据inst.m的值在此方法上设置一个条件断点,有人可以告诉我该怎么做吗?谢谢一群!
如果有人可以提供一些有关如何使用偏移量的信息(例如+ 0x004表示m),非常感谢!
因此,如果我做对了,你应该为条件使用布尔表达式.然而,当我尝试使用时,impact == null我收到以下错误:
Conditional breakpoint has compilation error(s).
Reason:
Syntax error on token "==", invalid AssignmentOperator.
Run Code Online (Sandbox Code Playgroud)
是什么赋予了?我做错了什么,我该如何解决?
我无法使用 strcmp 在 GDB 中创建条件断点:
break x if strcmp(str.c_str(), "foo") == 0
Run Code Online (Sandbox Code Playgroud)
你为什么问?
因为:
print strcmp("hello", "hello")
Run Code Online (Sandbox Code Playgroud)
产量
(int (*)(const char *, const char *)) 0x7ffff76ffe70 <__strcmp_sse2_unaligned>
Run Code Online (Sandbox Code Playgroud)
即使将其转换为整数:
print (int)strcmp("hello", "hello")
Run Code Online (Sandbox Code Playgroud)
它返回一些无意义的值,如 -143655312
这是“解决”我的问题的一种不太优雅的方法。我可以在自己的代码中定义一个函数:
int mystrcmp(const char *str1, const char* str2){
return strcmp(str1, str2);
}
Run Code Online (Sandbox Code Playgroud)
现在我可以使用这个函数来代替我的条件断点。但这不是真正的调试,是吗?当您必须更改原始代码以进行调试时,您就输了!
那么我错过了什么?
我刚刚开始使用断点在Management Studio(SQL Server 2008)中调试T-SQL存储过程。我注意到断点窗口有一个条件列:

但是我找不到任何方法来实际在断点上指定条件,而不是通过“调试”菜单,通过断点或断点窗口内的上下文菜单等。
有没有办法在SSMS中使用条件断点,或者该列是否存在于将来的版本中?
我正在尝试在 Xcode 中设置条件断点。如果浮点变量为 NaN,我希望它中断。不幸的是 Xcode 被卡住了NAN(似乎是编译器标签)。如何在断点条件下测试 NaN?
根据内存中的值在lldb中设置条件断点的语法是什么?
就像是:
breakpoint modify -c "memory read -Gx $esp+4 == 0"
或者,我想如果条件为false,我可以设置断点命令继续,但我也找不到它的语法:)
我正在调试没有源代码的应用程序,我使用IDA PRO + Windbg作为调试器.我正在接受CloseHandle使用特定句柄值的调用,例如handle = 0x14
我把条件断点像这样:
bp kernel32!CloseHandle "j (poi(@esp+4)=0x00000014) ''; 'gc'"
断点正常设置,但是每次调用都会中断CloseHandle,与我正在尝试的相反,只有在第一个参数等于时才会中断0x14