当突然出现某些工作原理或我的单元测试以不可预测的方式运行时,我通常不得不进入调试模式。我在调试模式下99%的时间用于检查对象上的字段值以验证其状态。
我已经设置了log4net,似乎如果我可以轻松添加一行代码来注销对象的状态,我可以删除大部分启动庞大调试器的需要。问题当然是隐式暴露对象状态,你需要手动覆盖每个对象的ToString()方法。我希望能够做的是能够执行logger.LogState(someObject)
并注销对象状态,至少包括所有私有变量,引用(到某个任意深度)和集合的格式化列表。 / p>
有没有人知道可以用来生成任何对象内部状态字符串的工具/框架/代码片段?我当然可以自己写一个,但这是一个非常重要的问题,我更喜欢有人考虑过的东西。
答案 0 :(得分:1)
您可以做的是将对象标记为Serializable,然后使用XMLSerializer将其序列化为某个流,类似于{{ {3}}到accepted answer。然后可以将其输出到您的日志中。
当然,它确实假设您实际上可以使所有对象都可序列化。
答案 1 :(得分:1)
如果要生成对象状态转储,则需要一个工具来了解可以为每个字段生成日志记录信息的对象状态的类型信息。 这样的工具需要能够解析源代码,构建符号表,枚举对象中的字段,并生成转储每个对象字段的代码。
DMS Software Reengineering Toolkit包含Java,C,C ++的所有必需元素,其中大部分内容适用于C#和JavaScript。您需要构建一个自定义脚本来驱动DMS以枚举您关心的类(除非您想要从每个可能的类和每个可能的方法调用中转储信息,否则需要定义它)并在函数入口上生成日志记录转储(和在感兴趣的代码中,甚至可能在控制流程块内。
答案 2 :(得分:1)
SmartInspect的LogObject方法可能对此有用。此方法记录所有对象属性和字段,您可以在控制台中轻松分析它们:
alt text http://www.gurock.com/images/feature/smartinspect-screenshot.png