我有一个我不断修改的数组。在我的程序完成后,执行我的修改并不能完全按照我的要求去做,所以我的数组并不是我想要的方式。我有一个函数读取数组的内容。有没有办法使用gdb并在某处放置断点,然后运行我的函数读取数组的内容?我想找出问题发生的地方。 Gdb不允许我运行“p readArray()”。 f我有一个断点。
答案 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语句处放置一个断点并在那里恢复程序计数器,否则返回将返回到第一个断点函数的调用者,这可能不是你想要的。
也就是说,调试器完全能够通过“监视”显示数组内容,所以除非内容需要特定的解释才能理解,否则这肯定是一种更好的方法?
另一个非调试器解决方法是将数组实现为内存映射文件或共享内存,然后使用单独的进程映射和显示相同的文件或内存。这种技术将特定于操作系统。