gdb上的“当前没有帧在指定块中执行”错误

mca*_*ado 5 c++ gdb

我在 C++ 中实现了一个 print_array 函数,并使用 gdb 来调试它。for 循环中似乎存在问题,但我真的不明白为什么。

代码是:

void print_array(const int array[], const int length) {
    cout << "[";
    for (int i=0; i<length; i++) {
        // Last element
        if (i == length-1) {
            cout << array[i] << "]" << endl;
        } else {
            // Any other element
            cout << array[i] << ", ";
        }
    }
    cout << endl;
}
Run Code Online (Sandbox Code Playgroud)

主要功能是:

int main() {

    int array[] = {1, 3, 5, 7, 9, 15, 15, 16, 40, 70};
    int length = 10;

    cout << "Array is = ";
    print_array(array, length);
.
.
.
Run Code Online (Sandbox Code Playgroud)

使用 gdb 调试它,并将其设置为 watch i,我得到以下信息

.
.
.
Thread 2 hit Hardware watchpoint 4: i

Old value = 9
New value = 10
0x0000000100001afd in print_array (array=0x7fff5fbff8e0, length=10) at binary_search.cpp:8
8       for (int i=0; i<length; i++) {
(gdb) 
No frame is currently executing in specified block
0x0000000100001b02 in print_array (array=0x7fff5fbff8e0, length=10) at binary_search.cpp:8
8       for (int i=0; i<length; i++) {
(gdb) 
No frame is currently executing in specified block
Command aborted.
(gdb) 
Run Code Online (Sandbox Code Playgroud)

要检查的基本内容是遍历数组的 for 循环,情况似乎并非如此(除非我遗漏了一些明显的内容)。

问这个问题的“真正原因”是 gdb 似乎总体上给出了奇怪的结果。我已安装在 Mac 10.12.3 中,但不支持原样。因此,安装时间很长,我在网上看到了其他类似的案例,人们在 Mac 10.12.3 上安装 gdb 后遇到了奇怪的问题。

Fel*_*uer 8

“当前没有帧在指定块中执行”意味着 gdb 试图从不属于应用程序帧的内存地址读取。

此时调试:

Thread 2 hit Hardware watchpoint 4: i

Old value = 9
New value = 10
0x0000000100001afd in print_array (array=0x7fff5fbff8e0, length=10) at binary_search.cpp:8
8       for (int i=0; i<length; i++) {
Run Code Online (Sandbox Code Playgroud)

循环条件不再为真,应用程序希望在 for 循环后继续。但是 GDB 仍在监视内存地址在哪里i

删除硬件观察点,delete 4应该可以继续调试。