如何在循环后制作断点?

时间:2011-12-15 07:14:06

标签: c++ linux gdb

#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时,没有打印任何内容。修复后,您提供的每种方法都可以正常工作。感谢。

7 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

gdb有一个添加断点的命令

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

(gdb)break filename:linenumber

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

break main.c:10

您可能需要尝试教程http://www.yolinux.com/TUTORIALS/GDB-Commands.html

答案 2 :(得分:1)

不必有一些声明让调试器能够设置断点。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

您可以在gdb命令行上指定源文件和循环结束行:

b file.c:123

如果你想在for循环之后,你会想要实际设置while()循环的右括号行的中断,我相信。但你可以尝试两种方法,看看是什么产生了预期的效果。

答案 5 :(得分:0)

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

  

如果程序试图退出当前程序,则始终停止程序   堆栈框架。

答案 6 :(得分:0)

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

if (i == 19)

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

ignore bnum 19

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

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