如何在断点上运行gdb中的程序函数?

时间:2011-06-04 04:57:53

标签: c gdb

我有一个我不断修改的数组。在我的程序完成后,执行我的修改并不能完全按照我的要求去做,所以我的数组并不是我想要的方式。我有一个函数读取数组的内容。有没有办法使用gdb并在某处放置断点,然后运行我的函数读取数组的内容?我想找出问题发生的地方。 Gdb不允许我运行“p readArray()”。 f我有一个断点。

4 个答案:

答案 0 :(得分:7)

每当遇到特定断点时,使用“命令”运行命令。例如,要在第一个断点上运行命令:

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

您可以使用“info break”来确定您感兴趣的断点数。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

break * addr“在地址addr处设置断点”

答案 3 :(得分:0)

'脏'方法是将程序计数器寄存器修改为代码中调用显示函数 的位置的地址。请务必在调用后设置断点,以便在此后希望代码继续正确的情况下将程序计数器恢复为原始值。

如果函数不接受参数,则更脏,是将程序计数器设置为函数中第一条指令的地址。在这种情况下,在return语句处放置一个断点并在那里恢复程序计数器,否则返回将返回到第一个断点函数的调用者,这可能不是你想要的。

也就是说,调试器完全能够通过“监视”显示数组内容,所以除非内容需要特定的解释才能理解,否则这肯定是一种更好的方法?

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