如何在GDB崩溃/段错误时编辑正在运行的程序

时间:2014-06-20 03:30:55

标签: c gdb

我正在尝试更改GDB中的变量值。我不确定如何正确地做到这一点。我在谷歌搜索但无法得到正确的答案。

这是我正在尝试的

(gdb) run set number = 4   **<---- here i try to set the number to 4** 
The program being debugged has been started already.
Start it from the beginning? (y or n) y

Starting program: /u/data/u3/msehgal/Desktop/CS252/lab1-src/debug set number = 4
warning: Could not load shared library symbols for linux-vdso.so.1.
Do you need "set solib-search-path" or "set sysroot"?

Breakpoint 1, main (argc=5, argv=0x7fffffffe4f8) at public.c:19
19    printf ("Starting tests.\n");
(gdb) n
Starting tests.
20    fflush (stdout);
(gdb) n
22    initialize_array ();
(gdb) n

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400ce8 in initialize_array () at public.c:40
40      numbers[i] = i + 1;
(gdb) print numbers
$3 = (int *) 0x0  **<---- on re-run the number is still 0**
(gdb) 

2 个答案:

答案 0 :(得分:1)

首先确保您尝试设置的变量在当前范围内。

比你应该使用

(gdb) set variable i = val

您可以查看是否已使用

进行更新
(gdb) p i

我认为你没有使用上面的variable

摘自this site

  

因为set命令有许多可能与之冲突的子命令   程序变量的名称,使用该集合是一个好主意   变量命令而不仅仅是设置。

答案 1 :(得分:0)

结果看起来变量numbers未初始化为数组,因此地址为0x00,并且您的程序尝试使用未初始化的数组,因此导致分段错误。

在你的gdb案例中,你犯了几个错误:

  1. 您使用的语法不正确;你应该使用:set var number=4
  2. 您在最开始设置变量值,仅在变量范围为全局时才有效;你应该确认变量范围,以便将值设置为正确的变量。
  3. 您将值设置为变量number而不是numbers,因此numbers不会更改。