Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在断点上运行gdb中的程序函数?_C_Gdb - Fatal编程技术网

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

C 如何在断点上运行gdb中的程序函数?,c,gdb,C,Gdb,我有一个不断修改的数组。在我的程序完成执行后,我的修改并没有完全达到我想要的效果,所以我的数组并没有达到我想要的效果。我有一个读取数组内容的函数。有没有一种方法可以使用gdb并在某处放置断点,然后运行我的函数读取数组的内容?我想知道问题发生在哪里。Gdb不允许我运行“p readArray()”。f我有一个断点。每当遇到特定断点时,使用“命令”运行命令。例如,要在第一个断点上运行命令,请执行以下操作: (gdb) commands 1 Type commands for when breakpo

我有一个不断修改的数组。在我的程序完成执行后,我的修改并没有完全达到我想要的效果,所以我的数组并没有达到我想要的效果。我有一个读取数组内容的函数。有没有一种方法可以使用gdb并在某处放置断点,然后运行我的函数读取数组的内容?我想知道问题发生在哪里。Gdb不允许我运行“p readArray()”。f我有一个断点。

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

(gdb) commands 1 Type commands for when breakpoint 1 is hit, one per line. End with a line saying just "end". > call readArray() > end (gdb)命令1 键入有关何时命中断点1的命令,每行一个。 用一句话结束,只说“结束”。 >调用readArray() >结束
您可以使用“信息中断”来确定您感兴趣的断点的数目。

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


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

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

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

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


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

你的GDB fu显然比我的好。我建议的“脏”解决方案适用于无法调用任意函数的调试器,但我想这与本例无关。