对于我当前的嵌入式应用程序,我试图将GDB观察点放在固定的内存地址上.
例如,我的应用程序更新以下地址:0x10793ad0.为了确保代码的哪一部分破坏了价值,我试过了
watch 0x10793ad0
Run Code Online (Sandbox Code Playgroud)
即使GDB在此之后没有打印任何错误,但即使我验证了值在执行的开始和结束之间被修改,它也无法在执行期间中断.
问题:
如果我为当前作用域的本地变量设置了一个观察点,它将在超出作用域时自动删除.有没有什么方法可以设置一次,并在进入同一范围时保持自动活动状态?
反正有没有设置条件观察点,比如watch var1 if var1==0?在我的情况下,条件不起作用.每当var1值改变时,gdb就会停止,而不是直到var1 == 0为真.我的gdb是GNU gdb 6.8-debian.
有没有办法跟踪Xcode中的变量更改或内存更改?我正在寻找像Visual Studio的数据断点这样的功能.
我想知道我的对象的视图框架在哪里被更改.我想在成员变量上设置断点并运行它.然后我可以确定它的变化.
在Objective-C中,我有时会在LLDB中设置观察点,以便在实例变量发生变化时通知我.我也可以使用Swift属性吗?
现在,我能做到这一点的唯一方法是:
[setPropertyName:]但这仅在该类恰好支持Objective-C桥接时才有效我还有其他选择吗?
我想在我的C++程序中暂时设置一个观察点(硬件写入中断)来查找内存损坏.
我已经看过所有通过gdb手动完成的方法,但我想通过我的代码中的某些方法实际设置观察点,所以我不必闯入gdb,查找地址,设置观察点然后继续.
就像是:
#define SET_WATCHPOINT(addr) asm ("set break on hardware write %addr")
Run Code Online (Sandbox Code Playgroud) 在大型C应用程序中,我在内存地址上设置了硬件观察点,如下所示:
(gdb) watch *0x12F5D58
Hardware watchpoint 3: *0x12F5D58
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它是硬件观察点,而不是软件,它可以解释缓慢的问题.
现在,调试器下的应用程序运行时间已从不到十秒变为一小时并且正在计数.到目前为止,观察点已触发三次,这是15分钟后第一次包含地址的内存页面可读sbrk.当然,在这15分钟内,由于内存页面无法访问,因此观察点应该是高效的吗?这仍然无法解释,为什么之后会如此缓慢.
平台是x86_64,GDB版本是Ubuntu 9.10包:
$ gdb --version
GNU gdb (GDB) 7.0-ubuntu
[...]
Run Code Online (Sandbox Code Playgroud)
和库存GDB 7.1来源:
$ gdb-7.1 --version
GNU gdb (GDB) 7.1
Run Code Online (Sandbox Code Playgroud)
提前感谢任何想法可能是什么原因或如何解决/解决它.
编辑:删除演员
编辑:gdb 7.1
我试图在Eclipse调试器的Java程序中使用watchpoint跟踪值的更改.类层次结构非常复杂,我跟踪的值包含在容器中,容器在很多地方使用.
更具体地说,有一个容器SizeRequirement,它有一个属性minimum,我正在跟踪.许多组件的许多布局管理器都使用此类来定义组件大小的要求.我需要捕获完全调用,其中值更改/设置为一个特定的布局管理器和其中的一个特定组件.是否可以通过调用者过滤断点?我将尝试使用一些抽象代码来解释问题:
class ValueContainer {
public String value;
}
class A {
private ValueContainer valueContainer;
public A () {
valueContainer = new ValueContainer();
valueContainer.value = "setByA";
}
}
class B {
private ValueContainer valueContainer;
public B () {
valueContainer = new ValueContainer();
valueContainer.value = "setByB";
}
}
Run Code Online (Sandbox Code Playgroud)
我设置了一个观察点value,我只希望断点只有在value由A类设置并且忽略B的调用时才挂起.
更糟糕的是,类SizeRequirement是swing库的一部分,并且深深地集成在代码中,因此我无法使用继承来替换某些孩子在我想跟踪它的某个确切位置.
编辑
所以这就是我用作条件断点条件的东西.信不信由你,它的确有效.:)
StackTraceElement[] arr = Thread.currentThread().getStackTrace();
boolean contains = false;
for(StackTraceElement e : arr) {
if (e.getClassName().contains("A")) {
contains = true; …Run Code Online (Sandbox Code Playgroud) 您可以通过以下步骤在XCode中轻松设置观察点(顺便提一下,如果有更简单的方法,我想知道它......):
- 运行程序
- 在使用变量的代码中设置断点
-到达断点时,右键单击变量并选择"Watch"nameOfTheVariable"'
- 继续执行.
唯一的问题是每次变量值改变时执行都会停止.我希望XCode继续执行而不停止,即只显示控制台输出中的值更改.
这个功能似乎在命令行模式下可用,虽然我最初想避免它,但是我发布了一个使用该模式的解决方案(见下文),因为它似乎是我想要的唯一方法,即在显示变量时继续执行变化.
如果我尝试设置观察点,我会收到gdb错误:
"没有'Z2'(写 - 观察点)数据包,无法清除硬件观察点"
然后它似乎破坏了设备(在重新启动设备时,它抱怨操作系统对于SDK太旧了,即使它是OS 3.1.2).
我有一个追踪错误的错误,很容易通过观察点追踪,所以这真的很痛苦.
谁知道观察点是否应该起作用?如何让他们工作?
我正在尝试在iOS上的Xcode 4.5中调试C++代码,在连接的iPad 2上运行应用程序.
我在我的代码上设置了一个常规断点,当我点击它时,我查看我的局部变量,点击一个变量并选择"Watch xxxxx".
lldb控制台显示:
错误:无法为m_step创建观察点
如果我尝试在控制台中手动设置它,使用以下命令,结果相同:
wsv xxxxx
我明白了:
错误:Wathpoint创建失败(addr = 0x ..... size = 4)错误:发送gdb观察点数据包失败
我使用LLDB运行调试配置.有任何线索我是否应该检查?
编辑:这是我的设置:
