gdb:循环内的 SIGFPE

发布于 2024-11-18 10:55:35 字数 380 浏览 3 评论 0原文

我在循环内发生了 SIGFPE。如果我设置断点或使用 stop、nopass 等处理 SIGFPE,我会在此行之后丢失帧变量。在断点的情况下,我需要首先通过执行n N到达那里,其中N是一个很大的数字,以便循环运行在断点上,直到这样发出 SIGFPE 时会出现变量值。通过处理或断点执行后,我丢失了框架变量,因此我无法反向搜索并进一步调试程序(变量脱离上下文)。

如何快速处理循环内的 SIGFPE?

谢谢!

新信息:是否可以通过逻辑观察点停止程序?我已经进入责任框架,发现相关变量的值为 350(它应该远小于零)。 不停止执行呢?

watch x0 > 100

为什么此时

I have a SIGFPE happening within a loop. If I set a breakpoint or handle the SIGFPE with stop, nopass, etc, i loose the frame variables after this line. In the case of a breakpoint, I need to first get there by executing n N, where N is a large number, so that the loop runs over the breakpoint within until such variable values occure that the SIGFPE is issued. After the execution by handling or breakpoint, I loose the frame variables, so I cannot reverse-search and further debug the program (variable out of context).

How do I handle a SIGFPE within a loop in a fast way?

Thanks!

New information: is it possible to stop a program with a logical watch point? I have gone into the responsible frame, and found that the variable in question attains a value of 350 (it should be way less than zero). Why doesn't

watch x0 > 100

stop the execution at this point?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

永不分离 2024-11-25 10:55:35

您以错误的方式使用watch

http://www.ofb.net/gnu/gdb/gdb_30.html#SEC30

观察表达式

为表达式设置观察点。当程序写入expr并且其值发生变化时,GDB将中断。

因此,您无法监视 x0>100,但可以监视 x0array[59] (监视的参数是地址在内存中)

对于您的任务,您可以使用条件中断。 http://www.ofb.net/gnu/gdb/gdb_29.html#SEC29

中断...如果条件

使用条件cond设置断点;每次到达断点时都对表达式 cond 求值,并且仅在该值非零时停止(即 cond 求值为 true 时)。 “...”代表上述可能的参数之一(或无参数),指定中断位置。有关断点条件的更多信息,请参阅中断条件部分。

所以

break main.c:345 if x0>100

You use watch in wrong way.

http://www.ofb.net/gnu/gdb/gdb_30.html#SEC30

watch expr

Set a watchpoint for an expression. GDB will break when expr is written into by the program and its value changes.

So, you can't watch a x0>100, but can watch a x0, or array[59] (argument of watch is address in memory)

For your task you can use conditional break. http://www.ofb.net/gnu/gdb/gdb_29.html#SEC29

break ... if cond

Set a breakpoint with condition cond; evaluate the expression cond each time the breakpoint is reached, and stop only if the value is nonzero--that is, if cond evaluates as true. `...' stands for one of the possible arguments described above (or no argument) specifying where to break. See section Break conditions, for more information on breakpoint conditions.

So

break main.c:345 if x0>100
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文