【问题标题】:How to debug a function with gdb如何使用 gdb 调试函数
【发布时间】:2020-05-27 18:03:37
【问题描述】:

使用 gdb,我可以在调用函数的任何地方放置断点,并逐步执行函数评估。我还可以使用 print 命令评估函数。当在任何断点处停止时,我想通过使用不同的参数逐步执行它来调试特定的函数。但是,当我尝试在函数处设置断点并为 gdb 提供合适的打印命令时,gdb 对象会显示消息“正在调试的程序在 gdb 调用的函数中停止。评估包含函数 MyClass::mysize 的表达式(int,int) 将被放弃”。有什么方法可以在不重新启动程序的情况下完成此操作?

【问题讨论】:

    标签: gdb


    【解决方案1】:

    您设法错过了来自 GDB 的部分消息。这是我的示例程序:

    int
    foo (int arg)
    {
      return arg + 3;
    }
    
    int
    main ()
    {
      return foo (-3);
    }
    

    这是我的 GDB 会话:

    (gdb) start
    Temporary breakpoint 1 at 0x401119: file eval.c, line 10.
    Starting program: eval.x 
    
    Temporary breakpoint 1, main () at eval.c:10
    10    return foo (-3);
    (gdb) break foo
    Breakpoint 2 at 0x40110d: file eval.c, line 4.
    (gdb) print foo (2)
    
    Breakpoint 2, foo (arg=2) at eval.c:4
    4     return arg + 3;
    The program being debugged stopped while in a function called from GDB.
    Evaluation of the expression containing the function
    (foo) will be abandoned.
    When the function is done executing, GDB will silently stop.
    (gdb) bt
    #0  foo (arg=2) at eval.c:4
    #1  <function called from gdb>
    #2  main () at eval.c:10
    (gdb) 
    

    请注意来自 GDB 的消息的最后一行:When the function is done executing, GDB will silently stop. 所以 GDB 仍然在带有您传递的参数的被调用函数中。可以在&lt;function called from GDB&gt; 的回溯中看到。

    因此,您可以继续单步执行该函数以查看其行为方式。你没有得到的是函数返回时打印的结果,GDB 已经忘记了这是你想要的,所以相反,当函数返回时,GDB 只会让你回到提示符。这意味着您应该在函数返回之前检查函数内部的返回值。

    【讨论】:

    • 如你所说。我完全被“放弃”这个词误导了,但我现在意识到被放弃的是结果的报告,而不是函数本身的执行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 2017-01-30
    • 2019-09-30
    • 2020-04-28
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多