Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.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++_C_Debugging_Gdb - Fatal编程技术网

C++ gdb的自动调试

C++ gdb的自动调试,c++,c,debugging,gdb,C++,C,Debugging,Gdb,我正在处理一个包含大量全局变量的大型代码库。在某些特殊的数据集下,它会产生错误的结果。我想用gdb自动地一步一步地执行和定期转储来自动运行一些场景 并将跟踪记录在某个文件中。手工操作会毁了我的视力和大脑。我推测全球有些混乱。如何自动执行此操作?使用一些脚本。所有这些都是在rhlinux中实现的。 提前谢谢 尝试使用条件中断手动执行此操作,但过了一段时间后放弃 我想用gdb自动地一步一步地执行一些场景,定期地转储一些值,并在一些文件中记录跟踪 在反向调试器(如)下运行程序,并将错误结果追溯到源代码

我正在处理一个包含大量全局变量的大型代码库。在某些特殊的数据集下,它会产生错误的结果。我想用gdb自动地一步一步地执行和定期转储来自动运行一些场景 并将跟踪记录在某个文件中。手工操作会毁了我的视力和大脑。我推测全球有些混乱。如何自动执行此操作?使用一些脚本。所有这些都是在rhlinux中实现的。 提前谢谢

尝试使用条件中断手动执行此操作,但过了一段时间后放弃

我想用gdb自动地一步一步地执行一些场景,定期地转储一些值,并在一些文件中记录跟踪

在反向调试器(如)下运行程序,并将错误结果追溯到源代码,可能会更有效

如何自动执行此操作

你不能自动地做你不能表达为算法的事情,你也没有描述你想要使用的算法。如果它像“每调用100次停止
foo
并打印这500个全局变量的值”,那么GDB就可以实现简单的自动化


使用嵌入式Python可以实现更复杂的算法。

在主文件夹的
.gdbinit
文件中添加

add-auto-load-safe-path /path_to_the_folder_containing_your_executable/
现在,您可以在可执行文件所在的同一文件夹中创建另一个
.gdbinit
文件,当您从那里启动gdb时,该文件将被加载(您家中的
.gdbinit
文件也是可读的,如果您有漂亮的东西,例如加载漂亮的打印机,该文件非常有用)

在这个
.gdbinit
文件中,添加下面的代码

file your_executable_name
start

# Optional
set args "<any command line parameters you program might need>"

# xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# Add gdb commands below to set breakpoints, print variable values, etc

# xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

run
您可能还希望在继续之前使用
delete breakpoint\u number
删除此断点,以避免再次在此断点处停止

然后,只要对象存在,您就可以使用
p$var1
p$var1->something
检查它,当程序在另一个断点停止时,
myglobal
可能无法直接访问

在您添加以在遇到断点时运行的命令中,您可以执行一些操作,例如
echo message解释您的位置
p一些变量的值,甚至
python一些复杂的python\u代码

如果您想使用python获得更强大的功能,那么值得阅读手册中的。让我给你举个例子。假设您的一个全局变量存储在一个名为“$myvar”的方便变量中。然后,您可以使用

python myvar = gdb.parse_and_eval("$myvar")
您还可以将当前范围内的任何变量传递到
parse\u和\u eval
。 现在,假设这个全局变量存储了一个类的对象,该类具有要检查的“n_elem”属性。你可以用打印机打印出来

python print(myvar["n_elem"])
您还可以在同一文件夹中创建python文件并使用

python from my_python_file import *
要导入其中定义的函数


使用这些gdb功能,您可以几乎自动完成您可能需要的任何操作。

将变量的日志记录添加到您正在调试的代码库中可能会更容易。感谢您的回复和建议,但我认为这在这里没有帮助。对我来说,反向调试是有意义的,因为从“结束”到某个结论的调试比从“开始”到“结束”的调试短。同样,反向调试对我来说意味着你知道从哪里开始反向调试,比如崩溃。很明显,我的情况不是这样,因为它会像累积效应一样消失。我在问什么-交互式gdb脚本,它的作用是:设置条件中断,一步一步地执行记录(N次),报告一些变量,请求重复?。谢谢
python from my_python_file import *