这个问题与this one I asked earlier this week有些相关。我还在处理C ++无法正确反映自己的代码。现在,虽然我遇到了几个以某种方式尝试添加此功能的库,但我想问一下,使用更容易获得和广泛使用(即更简单的实现)方法是否无法实现我需要做的事情。
我需要的是基本上某个时间点的对象实例的快照。它们可以有子对象(即某个对象“拥有”一个或多个其他对象的结构),但基本上就是这样。现在,虽然反射似乎是一个明显的选择,但由于项目总是用C ++编码,因此几乎已经排除了这一点。但是,调试器似乎正是我需要的(在某个时刻停止程序并告诉我当前在内存中的实例),所以我觉得我应该能够使用简单的调试技术实现某种信息提取。可以假定给定项目的代码可用。我的程序中的工作流程看起来像
虽然这基本上是我在调试时通常所做的事情,但我无法在另一个程序中找到有关如何自动执行此操作的任何信息。这将具有实现有限反射的优点,而无需任何进一步的库或代码更改。那么,有没有什么方法 - 最好是Java,C#或C ++,因为我最熟悉这些 - 只需加载和编译VS解决方案或执行makefile并执行上面给出的步骤?我不断发现很多页面告诉我如何使用调试器,但这在这里真的没用......
感谢您的帮助。
答案 0 :(得分:3)
如果不是Visual Studio,您可以查看GDB。这个调试器可以通过编程方式进行控制,它实际上是由某些调试器GUI使用的,因此您应该能够使用它执行步骤2-4。第一步,在这种情况下明显的选择是gcc。
答案 1 :(得分:1)
好吧,因为从你的另一个问题来看,你的平台是Windows,你原则上可以使用windbg和Windows调试工具或Windows SDK包中提供的相关(仅限命令行)调试器。
有了它,您可以轻松地以自动方式执行任务2到4 - 虽然4(自动检查实例)我认为不能自动执行本机(C ++)代码,因为正如您已经提到的,C ++缺乏类似于.net代码中的反射机制。
现在我不确定所有这些努力是否真的值得。如果你想要完成的只是调试/调整你的应用程序,你可以使用条件编译来调试/发布代码,并为追踪目的添加额外的代码。
答案 2 :(得分:0)
难道你不能简单地将代码转换为.NET应用程序并使用.NET反射吗?
答案 3 :(得分:0)
如果您要执行的操作是查看在执行程序的某个时刻已分配的内容,则代码分析器可能会有所帮助。代码分析器可以显示您的代码在特定时间点执行的操作的快照。在Linux上,valgrind是一个受欢迎的选择。 Visual Studio应该有一个分析器,虽然我从来没有使用它。