【问题标题】:Setting Conditional Breakpoint for Pointer Value为指针值设置条件断点
【发布时间】:2015-05-04 20:49:07
【问题描述】:

在 gdb 中,如何根据指针的值设置条件断点,记住我必须在取消引用指针之前检查指针是否为空?

这是我正在尝试调试的代码示例:

#include <iostream>
using namespace std;

int main () {
  int *i[10];
  int *j = NULL;
  int k;

  i[4] = new int;
  *i[4] = 8;

  for (k=0; k < 10; k++) {
    j = i[k];
  }

  return 0;
}

我在“j=i[k]”行设置了条件断点,但出现了段错误:

(gdb) b 14 if j && *j == 8
(gdb) r
Starting program: /nfs/blahblah/a.out
Failed to read a valid object file image from memory.
Program received signal SIGSEGV, Segmentation fault.

有人知道为什么会出现段错误吗?

【问题讨论】:

  • 如果你只输入b 14,它会停在哪一行?对我来说(gcc 4.8.2),它停在第 16 行,return 0,因为没有为第 14 行生成代码。
  • 我无法重现段错误。您使用的是什么编译器和操作系统版本?
  • 我尝试将条件断点(与您问题中的断点相同)放在 b 13 但没有段错误。

标签: pointers gdb conditional-statements breakpoints


【解决方案1】:

这是一个非常不寻常的错误消息:

无法从内存中读取有效的对象文件图像。

我认为您的可执行文件可能有问题。 file a.out 说什么?

【讨论】:

    【解决方案2】:

    不管是什么导致“无法从内存中读取有效的对象文件图像”消息,我认为您的意思是将数组 i 初始化为所有 NULLS

    int *i[10] = { 0 };
    

    代码必须使用 -O0 构建,因为局部变量 j 已设置但未使用。以下是修改后的代码在我的机器上的工作方式:

    t.cc

    #include <iostream>
    using namespace std;
    
    int main () {
      int *i[10] = { 0 };
      int *j = NULL;
      int k;
    
      i[4] = new int;
      *i[4] = 8;
    
      for (k=0; k < 10; k++) {
        j = i[k];
      }
    
      return 0;
    }
    

    示例会话

    $ gcc -O0 t.cc -o t
    $ gdb -q t
    (gdb) b 13 if j && *j == 8
    (gdb) run
    Breakpoint 1, main () at t.cc:13
    13      j = i[k];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多