gpt4 book ai didi

gdb - 使用调试器停止 iff

转载 作者:行者123 更新时间:2023-12-04 19:53:02 25 4
gpt4 key购买 nike

我想编写一个断言样式的宏,它仅在我在调试器中运行程序时才停止。据我所知,我机器上唯一可用的调试器是 gdb,所以我将讨论那个。

SIGTRAP 信号的文档表明它用于暂停调试器,因此我应该能够放置

if (!assertion) raise(SIGTRAP);

在我的代码中。它可以在正确的位置中断 GDB,但仅从命令行运行它也会停止程序,因为 bash 和 zsh 都有助于将“跟踪/断点陷阱”信号解释为意味着程序应该完全停止。

是否有任何 GDB 使用但我可以预期其他一切都会忽略的信号?或者是否有一种超越信号的方法可以在不中断非调试器操作的情况下暂停 GDB 中的执行?

最佳答案

派生一个 child 并尝试 ptrace parent 是一种可移植的 UNIX 方法,可以确定您是否正在被 ptraced,然后您可以执行 raise(signo) 被追踪时。

但是请注意,如果您在 stracetruss 下运行,此机制也会触发,有效地使您的程序在它们下崩溃,这可能是不可取的。

一种更容易实现的特定于 Linux 的方法是在 /proc/self/status 中查找非 0 TracerPid。这仍然具有与上述相同的缺点。

另一种特定于 Linux 的方法是调用 getppid,然后调用 readlink("/proc/$PARENT_PID/exe", ...),看看它是否指向到 GDB。

两个特定于 Linux 的示例都假定安装了 /proc,这通常是正确的,但并非必须如此。

Are there any signals that GDB uses but which I can expect that everything else ignores?

SIGWINCH 通常被非终端处理程序忽略。 GDB 也会忽略它,但您可以通过发出以下命令让 GDB 在 SIGWINCH 上停止:

(gdb) handle SIGWINCH stop print nopass
Signal Stop Print Pass to program Description
SIGWINCH Yes Yes No Window size changed

关于gdb - 使用调试器停止 iff,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13672163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com