问题标签 [watchpoint]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - gdb 观察点未激活
考虑代码:
info frame
在断点 1处运行的结果:
info frame
在断点 2处运行的结果:
我们看到main()
保存的返回地址在两个断点之间发生了rip at 0x7ffc176b2608
变化。0x7f8190fb92b1
0x2d28490fd6501
rip
但是,在with的地址上设置观察点watch * 0x7ffc176b2608
并重新运行可执行文件不会按预期暂停断点之间的执行。
怎么会这样?
- - - - - -编辑 - - - - - -
输出disassemble /s main
:
输出disassemble /s update
:
的内容~/.gdbinit
python - 如何在 gdb 上的断点之后添加软件观察点
我正在尝试调试一个 C 程序,该程序在其生命周期内分配和释放特定结构的各种实例。在某些时候,这些实例之一正在损坏。
为了调试它,我想在分配这些结构后不久设置观察点,并在它们被释放前不久删除观察点。为此,我编写了一个 python gdb 脚本(见下文),它实现了gdb.Breakpoint
:BreakpointAlloc()
和BreakpointFree()
. 前者有一种stop()
在分配的结构上添加观察点的方法,后者有一种stop()
删除观察点的方法。(观察点保存在由包含已分配实例地址的字符串索引的字典中。)
由于分配了大量实例(超过 100 个),我无法使用硬件观察点。然而,当使用软件观察点(通过第一次运行gdb.execute("set can-use-hw-watchpoints 0")
)时,程序似乎卡住了,我不知道发生了什么。
gdb python API 的文档建议你不应该做我正在做的事情。我相信这可以解释为什么该程序正在楔入:
功能:Breakpoint.stop ( self )
...
您不应该更改下级的执行状态(即 step、next 等),更改当前帧上下文(即更改当前活动帧),或更改、添加或删除任何断点。
考虑到文档,我还尝试修改我的程序以通过停止事件添加/删除观察点(见下文)。使用软件观察点时,也会出现同样的问题:程序似乎卡住了。
关于如何从断点操作观察点的任何想法?
(或有关如何调试此问题的任何其他想法?)
c - 差异软件和硬件观察点
在阅读本文档时,
我没有发现软件和硬件观察点之间的区别。我读到软件断点(不是观察点)用不正确的指令替换指令以触发中断(然后停止程序),并且硬件断点将要停止的指令的地址放在寄存器中并将其与每个执行的指令。
但是,我在观察点的文档中读到“GDB 通过单步执行程序并每次测试变量的值来执行软件观察点”,这基本上是我理解的硬件观察点的定义。
有人对软件和硬件观察点之间的区别有更好的理解吗?
swift - 在数组的元素上设置观察点 - Swift
在下面的评论中回答了问题
我有一个对象数组,并且对象的属性不断变化。我想在数组的几个元素中为该特定属性设置一个观察点。那可能吗?
我已经看到了有关如何快速设置观察点的答案,但是当该数组的元素发生更改时,在数组上设置观察点并不会停止调试器。如果将元素添加到数组中,它甚至不会停止
谢谢您的帮助!
澄清:我正在寻找对数组特定元素的更改
澄清:根据下面的评论,我意识到数组与问题无关。我想一个更好的问题是,如何在对象的属性上设置观察点?
debugging - 硬件断点之前内核上的硬件断点功能
如果可以的话请帮忙。我需要调试对内核模块抛出机制中某些变量的访问,允许每次在需要访问时打印堆栈。我知道最简单的方法是使用硬件断点(也称为观察点),https://github.com/torvalds/linux/blob/master/kernel/events/hw_breakpoint.c使用处理器调试寄存器,写入它监控地址,并可以生成中断,可以通过回调函数处理你需要的一切。
但不幸的是,在我的项目中使用的是旧版本的 linux 内核,然后添加了这个功能。所以由于项目限制,我无法升级项目内核。我发现,在内核可用的 watch.c 中: https ://github.com/torvalds/linux/blob/master/arch/mips/kernel/watch.c 这个函数是否提供类似的功能,比如硬件断点,或者没有? 我找不到此功能的文档。
我需要这个的根本原因是有人在内核模块中间接破坏了指向内存的指针,结果是“未对齐的内存访问内核崩溃”。所以也许提出了一些另一种调试技术,可以帮助找到代码的一部分,这样做,作为断点(观察点)的替代品?非常感谢您提供任何有用的信息。
debugging - 在 WinDbg 的一行上设置读取观察点
我知道观察点用于在变量更改其值、读取或执行某些代码时控制已调试的程序。
我需要在 WinDbg 中的特定代码行上使用观察点(不是断点),我该怎么做?
我知道我可以很容易地设置一个读取观察点:
ba r 1 0x11223344
但是我如何知道我希望程序在到达时中断的特定代码行的地址?
谢谢
c++ - 在 lldb 中为大型数据结构设置观察点
我正在学习 lldb,我很好奇您如何为更大的数据结构(例如向量)设置观察点。我知道我可以使用 print 并且有效,但我收到一条消息,说不支持大小为“x”的观察点。有没有解决的办法?谢谢您的帮助!
eclipse - Eclipse CDT 无法设置观察点(始终禁用 - 灰显)
我无法使用 CDT 在 Eclipse (Photon) 中设置观察点。
根据这个关于在 CDT 中设置内存断点的问题的答案,应该可以通过执行以下操作来设置观察点:
- 在编辑器中突出显示变量,或在大纲视图中选择它。
- 单击
Run > Toggle Watchpoint
。
但是,无论我做什么,菜单项 Toggle Watchpoint 始终处于禁用状态(灰显)。
c - 在不停止执行的情况下观察 gdb 中的局部变量
我试图让 GDB 在变量更改时打印它的值。
给定一个示例程序,我想在它发生变化时获取x
in的值func
,但是让程序在没有提示的情况下继续:
我尝试过的:
虽然这将成功获取x
何时更改的值,但问题是当离开范围时x
,gdb 将停止通知我它正在离开范围x
并且正在删除观察点。有没有办法让 GDB 在自动删除观察点时继续执行而无需用户提示?
我遇到了这个问题:gdb:当局部变量上的观察点超出范围时不要中断 但是它从未收到解决方案。
debugging - 如何在寄存器中设置 GDB 读取观察点?
我正在尝试在寄存器中设置读取观察点。通过阅读用户手册。我了解如何在寄存器中设置观察点
watch [-l|-location] expr [thread thread-id] [mask maskvalue]
为表达式设置观察点。当程序写入表达式 expr 并且其值发生变化时,GDB 将中断。
例如:watch $r1
。这意味着当程序写入寄存器 r1 并且其值发生变化时,GDB 将中断。有用!
但是当我使用: 时rwatch $r1
,gdb 的回复是"Expression cannot be implemented with read/access watchpoint."
所以我想知道如何在寄存器中设置读取观察点。或者当程序读取寄存器时有什么方法可以中断?
非常感谢!