此問題與this one I asked earlier this week有些相關。我仍然在處理C++無法正確反映自己的代碼的問題。現在,雖然我遇到了幾個試圖添加這個功能的庫,但我想問一下,如果使用更容易獲得和廣泛使用(即更簡單的實現)方法無法實現我需要做的事情。使用C++調試器作爲反射替代
我需要的基本上是某個時間點的對象實例的快照。他們可以有子對象(即某個對象具有一個或多個其他對象的結構),但基本上就是這樣。現在,儘管反射似乎是一個明顯的選擇,但由於項目始終使用C++進行編碼,因此已經排除了這種情況。然而,調試器似乎只是做我所需要的(在特定時間停止程序並告訴我當前在內存中的實例),所以我覺得我應該能夠使用簡單的調試技術來實現某種信息提取,例如給定項目的代碼可以假定爲可用。我的程序中的工作流可能看起來像
- 編譯C++代碼在調試模式下
- 構建和調試
- 設置斷點(如我所知道的方法調用這表明全部所需的實例已創建)
- 運行和檢查某個類的實例(和子實例)(及其繼承類型),提取該信息用於進一步處理
雖然這基本上是我通常在調試過程中,我一直無法從另一個程序中找到有關如何自動執行此操作的任何信息。這將有利於在沒有任何其他庫或代碼更改的情況下實現有限的反射。那麼,有沒有什麼辦法 - 最好是在Java,C#或C++中,因爲我最熟悉這些 - 只是加載和編譯VS解決方案或執行makefile並執行上面給出的步驟?我一直在找很多頁面告訴我如何使用調試器,但是在這裏真的沒用......
感謝您的幫助。
爲什麼你仍然在使用C++,如果你有需要反思的哭聲?爲什麼不使用爲您提供反思的語言? –
@Alexandre:我很樂意。沒有一個同事不知道我認爲C++是這個工作的錯誤語言。但是,目標是分析在SystemC中編寫的系統設計。由於SystemC是一個C++庫,因此它是成立的。我只需要處理它: - /。 – Jay
我已經進一步使用正在使用的庫的一些內部API。另外,我現在使用MS DIA SDK。雖然我目前還不確定這是否能夠實際檢索我需要的運行時信息,但這似乎大部分都是由庫的API所覆蓋。最重要的是,DIA SDK提供對各種類型信息(方法,字段,基類等)的訪問,這是我所需要的反射功能的重要組成部分。除了MSDN http://www.developerfusion.com/article/84368/debugging-with-the-dia-sdk/是一個很好的開始,以防萬一... – Jay