如何在循环之后设置断点

How to make a break point just after loop?

本文关键字:设置 断点 之后 循环      更新时间:2023-10-16
#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时,什么也没输出。修复后,您提供的每个方法都可以正常工作。谢谢。

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

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

gdb有一个添加断点的命令

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

(gdb) break filename:linenumber

例如,我想在main。c

的第10行换行

打破c: 10

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

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

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

您可以在gdb命令行中指定循环结束的源文件和行,如下所示:

b file.c:123

如果您想在for循环之后执行,我相信您需要为while()循环的右括号设置换行符。但是您可以尝试这两种方法,看看哪种方法会产生期望的结果。

尝试使用until命令。避免单步执行循环是很有用的。同样来自gdb手册:

直到总是停止程序,如果它试图退出当前堆栈框架。

如果是我,我会像其他人说的那样设置一个程序集断点。但是,如果您不想陷入其中,有一种更简单的方法:由于您知道循环计数(20),并且它不是很大,因此可以在循环内的最后一条语句(在您的示例中,是循环内唯一的语句)上设置断点,条件为

if (i == 19)

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

ignore bnum 19

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

更多信息请参见gdb文档中的断点、观察点和捕获点。