gpt4 book ai didi

loops - 如何在 GDB 脚本中循环直到程序完成?

转载 作者:行者123 更新时间:2023-12-04 07:38:41 25 4
gpt4 key购买 nike

define traverse
while(CONDITION)
if $start == 0
set $start = 1
print_node
print_rss_item
else
continue
print_node
print_rss_item
end
end
end

如果程序完成,我需要什么条件来停止循环?

最佳答案

查看您的 gdb 脚本:

define traverse
while(CONDITION)
if $start == 0
set $start = 1
print_node
print_rss_item
else
continue
print_node
print_rss_item
end
end
end

需要注意的几点:
  • gdb 脚本(所谓的“调试器”)和调试对象总是在切换模式下运行:只要 GDB 脚本运行,调试对象就会暂停并且不运行,并且每当调试对象运行时,gdb 脚本就会暂停并且不运行。
  • 为什么会这样?这是因为每当被调试者处于暂停模式(读取“ptrace()”API 及其各种选项:PEEKUSER、POKEUSER、PTRACE_CONT)时,调试器实际上可以干净地(和内存一致地)读取被调试者的内存而不必担心腐败,因此它的所有变量值等。

  • 当调试器没有运行时,即它执行了“继续”操作,其中控制权被传递给了被调试者,因此被调试者可以继续运行并改变自己的内存,而不必担心被另一个进程错误地读取——因为它不能发生了。

    那么我们如何知道调试对象何时结束呢?当“继续”失败时,gdbscript 将不会继续运行。但是如果你设置了一个没有任何断点的调试对象,然后执行 gdb "run"命令你会发现调试对象连续运行,而 gdb 脚本没有机会执行。

    如此有效,如果您的脚本正在运行,则调试对象处于 STOP 模式,反之亦然。如果调试对象已通过调用 exit() 结束,则 gdb 脚本也不会运行。

    例如:
    defining the macro (inside .gdbinit file):

    define myloop_print
    set $total = $arg0
    set $i = 0
    while($i<$total)
    set $i = $i + 1
    print $i, $i
    cont
    end
    end

    然后运行“gdb/bin/ls”,然后是“break write”和“run -al”,然后是“myloop_print 10000”(顺序或顺序很重要),我们可以看到每次“write”都会中断, gdbscript 将打印出计数器。

    执行的最后几行是:
    Breakpoint 1, write () at ../sysdeps/unix/syscall-template.S:81
    81 in ../sysdeps/unix/syscall-template.S
    $40571 = 285
    drwxrwxr-x 2 tthtlc tthtlc 4096 Feb 18 00:00 yocto_slide
    [Inferior 1 (process 7395) exited normally]
    $40572 = 286
    The program is not being run.
    (gdb)

    这清楚地表明最后打印的计数器是 286,即使我指定了 10000 作为限制。

    在没有调试对象的情况下运行宏:
    (gdb) myloop_print 10000
    $40573 = 1
    The program is not being run.
    (gdb)

    我们可以看到 gdbscript 不会运行。

    如果您执行“gdb/bin/ls”,然后执行“myloop_print 10000”(假设宏在 .gdbinit 中定义),那么您将获得 gdbscript 运行完成 10000 次循环 - 无需调试器运行。

    关于loops - 如何在 GDB 脚本中循环直到程序完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20481815/

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