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