2011-08-10 19 views
1

此問題與this one I asked earlier this week有些相關。我仍然在處理C++無法正確反映自己的代碼的問題。現在,雖然我遇到了幾個試圖添加這個功能的庫,但我想問一下,如果使用更容易獲得和廣泛使用(即更簡單的實現)方法無法實現我需要做的事情。使用C++調試器作爲反射替代

我需要的基本上是某個時間點的對象實例的快照。他們可以有子對象(即某個對象具有一個或多個其他對象的結構),但基本上就是這樣。現在,儘管反射似乎是一個明顯的選擇,但由於項目始終使用C++進行編碼,因此已經排除了這種情況。然而,調試器似乎只是做我所需要的(在特定時間停止程序並告訴我當前在內存中的實例),所以我覺得我應該能夠使用簡單的調試技術來實現某種信息提取,例如給定項目的代碼可以假定爲可用。我的程序中的工作流可能看起來像

  1. 編譯C++代碼在調試模式下
  2. 構建和調試
  3. 設置斷點(如我所知道的方法調用這表明全部所需的實例已創建)
  4. 運行和檢查某個類的實例(和子實例)(及其繼承類型),提取該信息用於進一步處理

雖然這基本上是我通常在調試過程中,我一直無法從另一個程序中找到有關如何自動執行此操作的任何信息。這將有利於在沒有任何其他庫或代碼更改的情況下實現有限的反射。那麼,有沒有什麼辦法 - 最好是在Java,C#或C++中,因爲我最熟悉這些 - 只是加載和編譯VS解決方案或執行makefile並執行上面給出的步驟?我一直在找很多頁面告訴我如何使用調試器,但是在這裏真的沒用......

感謝您的幫助。

+0

爲什麼你仍然在使用C++,如果你有需要反思的哭聲?爲什麼不使用爲您提供反思的語言? –

+0

@Alexandre:我很樂意。沒有一個同事不知道我認爲C++是這個工作的錯誤語言。但是,目標是分析在SystemC中編寫的系統設計。由於SystemC是一個C++庫,因此它是成立的。我只需要處理它: - /。 – Jay

+0

我已經進一步使用正在使用的庫的一些內部API。另外,我現在使用MS DIA SDK。雖然我目前還不確定這是否能夠實際檢索我需要的運行時信息,但這似乎大部分都是由庫的API所覆蓋。最重要的是,DIA SDK提供對各種類型信息(方法,字段,基類等)的訪問,這是我所需要的反射功能的重要組成部分。除了MSDN http://www.developerfusion.com/article/84368/debugging-with-the-dia-sdk/是一個很好的開始,以防萬一... – Jay

回答

3

如果Visual Studio不是必須的,你可以看看GDB。這個調試器可以通過程序控制,它實際上是由一些調試器GUI使用的,所以你應該可以用它來執行步驟2-4。對於第一步,在這種情況下明顯的選擇是gcc。

1

好,因爲它從您的其他問題,你的plattform是Windows下你可以使用WinDbg和相關(命令行只)調試的調試工具的Windows或Windows SDK封裝做到這一點的原則似乎。

有了它,你可以輕鬆地以自動化的方式執行任務2到4 - 儘管4(自動檢查實例)我認爲不可能自動執行原生(C++)代碼,因爲正如你已經提到的那樣,C++在.net代碼中缺少反射機制。

現在我不確定這些努力是否真的值得。如果您要完成的所有工作都是調試/調整應用程序,則可以使用條件編譯進行調試/發佈代碼,併爲追蹤目的添加額外的代碼。

0

無法只需將代碼轉換爲.NET應用程序和使用.NET反射?

+0

對不起,但這是一個不-走。我正在處理的事情應該與現有的C++應用程序兼容 - 如果可能,應避免對底層庫,程序的源代碼或正在使用的編譯器進行任何更改。 – Jay

+1

然後,您可能必須執行命令行調試器路由,將其附加到您的進程,並在您想要的對象的合理位置發出中斷以便轉儲它們。這段代碼項目文章可以很好地概述可供您使用的標準調試器http://www.codeproject.com/KB/debug/windbg_part1.aspx。 – Damon8or

0

如果你正在嘗試做的是看看是什麼在你的程序執行的某一點被分配一個代碼分析器可以幫助。代碼分析器可以顯示您的代碼在特定時間點所做的快照。在Linux上,valgrind是一個流行的選擇。 Visual Studio應該有一個分析器,儘管我從來沒有使用它。