2011-06-04 137 views
0

我有一个数组,我不断修改。在我的程序完成后执行我的修改并不完全符合我希望他们做的事情,所以我的数组并没有变成我想要的方式。我有一个读取数组内容的函数。有没有办法使用gdb并在某处放置断点,然后运行读取数组内容的函数?我想找出问题出在哪里。 Gdb不让我运行“p readArray()”。 f我有一个断点。如何在断点处运行gdb中的程序函数?

回答

0

这听起来像你想要的是在阵列上设置手表。语法是watch <expression> - 参考this question了解有关使用动态数组的手表的更多信息(它是C++,但在C中应该相同)。

+0

嗯..有无论如何使用该功能?它以更有组织的方式打印出信息。 – hut123 2011-06-04 05:11:19

6

使用“命令”在命中特定断点时运行命令。例如,对第一个断点运行命令:

 
(gdb) commands 1 
Type commands for when breakpoint 1 is hit, one per line. 
End with a line saying just "end". 
> call readArray() 
> end 

您可以使用“信息断裂”,以确定您所感兴趣的断点数量

+0

你的GDB fu明显比我的好。我建议的“脏”​​解决方案适用于无法调用任意函数的调试器,但我想这在这种情况下是不相关的。 – Clifford 2011-06-04 06:46:41

0

设置breakboint地址。在malloc或静态创建数组的地方获取数组的地址,并在地址处设置断点。

休息*地址

0

A“脏”的方法“于addr设置断点”是修改程序计数器寄存器到一个位置的地址,你的代码中显示功能调用。确保在调用之后设置断点,以便您可以将程序计数器恢复为其原始值,如果您希望代码在此后继续正确运行。

即使更脏,如果函数不带参数,也是将程序计数器设置为函数中第一条指令的地址。在这种情况下,在return语句中放置一个断点并在那里恢复程序计数器,否则返回将返回到第一个断点函数的调用者,这可能不是您想要的。这就是说,调试器完全能够通过“watch”显示数组内容,所以除非内容需要特定的解释来理解它,否则这肯定会是一个更好的方法吗?

另一个非调试器解决方法是将数组实现为内存映射文件或共享内存,然后使用单独的进程映射和显示相同的文件或内存。这种技术将是操作系统特定的。