【问题标题】:How to make a break point just after loop?如何在循环后设置断点?
【发布时间】:2011-12-15 07:14:05
【问题描述】:
#include <iostream>
#include <vector>

using namespace std; 
int in;

bool isPrime(int n) {
    for (int i = 3; i <= n; i ++) {
        if (n%i != 0) {
            return false;
        }
    }
    return true;
}

vector<int>* generateVector(int n) {
    vector<int> v;
    for (int i = 2; i < 20; i ++) {
        if (i == n) {
            continue;
        }

        if (isPrime(i+n)) {
            v.push_back(i);
        }
    }
}

int main()
{
    while(1) {
        cin >> in;
        vector<int>* nVectors[21];
        for (int i = 1; i <= 20; i ++) {
            nVectors[i] = generateVector(i);
        } <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    }
}

这是一些 c++ 代码。我想在 for 循环之后做一个断点(箭头显示位置)。 我找到了一种解决方法,方法是在它之后添加一条语句,然后在该语句中设置断点。但是添加一个没有意义的陈述会让人感觉不好。那么有没有更好的解决方案呢?

我正在使用 GDB 进行调试。

PS:我已经知道如何在 gdb 中设置断点。我的意图是在 for 循环结束后中断,并显示 nVectors 中的内容。谢谢。

对不起。这不是 gdb 或调试技能的问题,而是我的代码中有一个错误。所以当我打印nVectors 时,什么都没有打印。修复后,您提供的每种方法都可以正常工作。谢谢。

【问题讨论】:

  • 您是否尝试在关闭函数的“}”上设置断点?
  • 我试过了,但是失败了。它会直接运行到main中的“}”。
  • 错误是 generateVector 不返回任何内容(或者您可能会冒返回局部变量地址的风险),这两者都可以在编译时通过启用编译器警告来捕获。 - 由于 nVectors 包含指向垃圾的指针,我看不出检查它包含的内容有什么帮助。
  • 是的,你是对的。我几乎为此感到羞耻。但我是一名java程序员,并尝试学习一些cpp编程技能。所以一些java学科对我影响很大。

标签: c++ linux gdb


【解决方案1】:

可以使用assembly断点,只需要了解for循环的汇编代码即可。

gdb <your_bin>
layout split
break *0x80488ad              #assmebly code will look like 
                              #0x80488ad     jmp    0x8048874 <main+18>     

【讨论】:

    【解决方案2】:

    gdb有添加断点的命令

    有几种方法,但我认为可能对您有所帮助的是:

    (gdb) 中断文件名:行号

    例如,我想在 main.c 的第 10 行中断

    打破 main.c:10

    你可能想试试教程http://www.yolinux.com/TUTORIALS/GDB-Commands.html

    【讨论】:

      【解决方案3】:

      不,调试器必须有一些语句才能设置断点。

      【讨论】:

      • 我想也许你是对的。我之前问过人,他也给了我这个答案,并建议我在循环后添加一个愚蠢的代码进行调试。
      【解决方案4】:

      我认为没有办法直接做你想做的事,但你仍然可以做到。在循环的最后一条语句上设置断点。当调试器中断时,切换反汇编视图并向下滚动,直到找到要放置真正断点的位置。这将有效地在特定地址而不是在源文件中的行号设置断点。

      【讨论】:

        【解决方案5】:

        你可以在gdb命令行中指定源文件和循环结束的行,像这样:

        b file.c:123
        

        如果您想在 for 循环之后立即执行,我相信您实际上需要为 while() 循环的右括号的行设置中断。但您可以同时尝试两种方法,看看效果如何。

        【讨论】:

          【解决方案6】:

          尝试使用until 命令。避免单步执行循环很有用。同样来自gdb manual

          如果它试图退出当前程序,它总是会停止你的程序 堆栈帧。

          【讨论】:

            【解决方案7】:

            如果是我,我会设置一个程序集断点,就像其他人说的那样。但是如果你不想进入那个,有一个更简单的方法:因为你知道循环计数(20),而且它不是很大,你可以在循环内的最后一个语句上设置一个断点(在你的情况下, 循环内唯一的语句), 带有条件

            if (i == 19)
            

            或者,您可以设置忽略计数:

            ignore bnum 19
            

            其中bnum 是断点编号。这可能更快,但在您的情况下,差异可以忽略不计。

            有关更多信息,请参阅 gdb 文档中的 Breakpoints, watchpoints, and catchpoints

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-02-25
              • 2021-02-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-12-28
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多