C# 用C++调试器作为反射替代

C# 用C++调试器作为反射替代,c#,c++,debugging,reflection,compilation,C#,C++,Debugging,Reflection,Compilation,这个问题有点与我有关。我仍然在处理C++无法正确反映其自身代码的问题。现在,当我遇到几个库试图以某种方式添加此功能时,我想问一下,如果使用更容易获得和广泛使用的ie更简单的实现方法,是否无法实现我需要做的事情 我需要的基本上是某个时间点上对象实例的快照。它们可以有子对象,即一个对象有一个或多个其他对象的结构,但基本上就是这样。现在,虽然反射似乎是一个明显的选择,但由于项目总是用C++编码,这已经被排除在外。然而,调试器似乎正是我所需要的,在某一点停止程序并告诉我当前内存中的实例,因此我觉得我应该

这个问题有点与我有关。我仍然在处理C++无法正确反映其自身代码的问题。现在,当我遇到几个库试图以某种方式添加此功能时,我想问一下,如果使用更容易获得和广泛使用的ie更简单的实现方法,是否无法实现我需要做的事情

我需要的基本上是某个时间点上对象实例的快照。它们可以有子对象,即一个对象有一个或多个其他对象的结构,但基本上就是这样。现在,虽然反射似乎是一个明显的选择,但由于项目总是用C++编码,这已经被排除在外。然而,调试器似乎正是我所需要的,在某一点停止程序并告诉我当前内存中的实例,因此我觉得我应该能够使用简单的调试技术实现某种信息提取,因为可以假设给定项目的代码可用。我的程序中的工作流可能看起来像

在调试模式下编译C++代码 创建并附加调试器 设置断点,因为我知道该方法调用指示已创建所有需要的实例 运行并检查某个类及其继承类型的实例和子实例,提取此信息以供进一步处理 虽然这基本上是我调试时通常做的事情,但我无法从另一个程序中找到有关如何自动执行此操作的任何信息。这样做的好处是实现某种有限的反射,而无需进一步修改库或代码。那么,有没有办法——最好是在爪哇、C或C++中,如我最熟悉的那样——只需加载和编译VS解决方案或执行MaFe文件并执行上面给出的步骤?我一直在寻找很多页面,告诉我如何使用调试器,但这在这里真的没有用


感谢您的帮助。

如果不需要Visual Studio,您可以查看。此调试器可以通过编程方式控制,它实际上由一些调试器GUI使用,因此您应该能够使用它执行步骤2-4。对于第一步,在这种情况下,最明显的选择是gcc。

如果不是必须使用Visual Studio,您可以看看。此调试器可以通过编程方式控制,它实际上由一些调试器GUI使用,因此您应该能够使用它执行步骤2-4。对于第一步,在这种情况下,最明显的选择是gcc。

因为从您的另一个问题来看,您的平台形式是Windows,所以原则上可以使用windbg和Windows调试工具或Windows SDK包中提供的相关命令行调试器来完成这项工作

<>它可以自动地执行任务2到4——尽管4自动检查实例,我认为不可能自动地为本机C++代码做,因为正如你已经提到的,C++缺少类似.NET代码中的反射机制。p>
现在我不确定所有这些努力是否真的值得。如果您试图完成的只是调试/调优应用程序,那么您可以使用条件编译进行调试/发布代码,并添加额外的代码进行跟踪。

既然您的另一个问题是您的平台是Windows,那么原则上您可以使用windbg和相关的命令行调试器来完成这项工作Windows调试工具或Windows SDK软件包

<>它可以自动地执行任务2到4——尽管4自动检查实例,我认为不可能自动地为本机C++代码做,因为正如你已经提到的,C++缺少类似.NET代码中的反射机制。p>
现在我不确定所有这些努力是否真的值得。如果您试图完成的只是调试/调优应用程序,那么您可以使用条件编译来调试/发布代码,并添加额外的代码以进行跟踪。

您不能简单地将代码转换为.NET应用程序并使用.NET反射吗?

您不能简单地将代码转换为.NET应用程序并使用.NET反射吗反射?

如果您要做的是查看在程序执行过程中的某一点分配了什么,那么代码分析器可能会有所帮助。代码探查器可以向您显示特定时间点代码执行情况的快照。在Linux上,valgrind是一个流行的选择。Visual Studio应该有一个探查器,尽管我从未使用过它。

如果您试图做的是查看在程序执行的某个点分配了什么,那么代码探查器可能会有所帮助。代码探查器可以向您显示特定时间点代码执行情况的快照。在Linux上,valgrind是一个流行的选择。VisualStudio应该有一个分析器,尽管我从未使用过它。

为什么你还在使用它
如果你需要反思,使用C++吗?为什么不使用一种能让你反思的语言呢?@Alexandre:我很乐意。没有同事不知道我认为C++是错误的语言。不过,我们的目的是分析用SystemC编写的系统设计。而SystemC是C++库,这是一个石头。我只需要处理它:-/。我通过使用库进一步使用了一些内部API。此外,我现在正在使用MS DIA SDK。虽然我目前不确定这是否真的能让我检索到所需的运行时信息,但这些库的API似乎主要涵盖了这一点。最重要的是,diasdk提供了对各种类型信息方法、字段、基类等的访问,这是我所寻找的反射功能的一大部分。除了MSDN是一个伟大的开始,以防万一……为什么你仍然使用C++,如果你有一个迫切需要反思?为什么不使用一种能让你反思的语言呢?@Alexandre:我很乐意。没有同事不知道我认为C++是错误的语言。不过,我们的目的是分析用SystemC编写的系统设计。而SystemC是C++库,这是一个石头。我只需要处理它:-/。我通过使用库进一步使用了一些内部API。此外,我现在正在使用MS DIA SDK。虽然我目前不确定这是否真的能让我检索到所需的运行时信息,但这些库的API似乎主要涵盖了这一点。最重要的是,diasdk提供了对各种类型信息方法、字段、基类等的访问,这是我所寻找的反射功能的一大部分。除此之外,MSDN是一个很好的开始,以防万一……对不起,这是不可能的。我正在做的事情应该是与相当大的现有C++应用程序兼容——如果可能的话,在底层库、程序的源代码或编译器中的任何更改都是可能避免的。那么,您可能需要去命令行调试器路由,附加到您的流程,并在您希望的对象在范围内的适当位置发出中断,以转储它们。这篇代码项目文章很好地概述了您可以使用的标准调试器。很抱歉,这是不可能的。我正在做的事情应该是与相当大的现有C++应用程序兼容——如果可能的话,在底层库、程序的源代码或编译器中的任何更改都是可能避免的。那么,您可能需要去命令行调试器路由,附加到您的流程,并在您希望的对象在范围内的适当位置发出中断,以转储它们。这篇代码项目文章很好地概述了您可以使用的标准调试器。