2014-04-03 45 views
1

我有很多c結構(包含含有包含子結構的聯合的子結構...)),並希望以類似的方式,如海灣合作委員會可以做的打印它們。轉儲c結構類似於海灣合作委員會,但作爲可調用的c函數

所以我不想做這樣的事情在How do I dump an arbitrary struct in C?描述,堂妹那只是一個hexdump都

,我也不用想創造某種反省(Java /現代C++等),只是想用知識海灣合作委員會已經/爲gdb生成,並添加一些我知道的知識(如如何選擇正確的聯盟變體)

Linux C: Easy & 'pretty' dump/printout of structs (like in gdb) - from source code?中提出的。

所以我的計劃是:取得我擁有的所有漂亮的c代碼,讓gcc處理它併產生一些元信息,然後在第二回閤中被某些東西解析/分析,然後能夠解釋/根據這些信息打印一段內存。

Linux中有一個工具,叫做pstruct/c2ph,whicht做類似的東西,似乎是在知識,可以進行修改,以做我想做的一定程度..

所以,基本上進出口尋找一個工具,它需要一個文件包含

struct X { 
    int a; 
    char *b; 
} 

併產生函數lile printX(void * p);然後打印如 {a:1,b:「lala」},如果p指向相應的X

那麼有沒有可以做到這一點的東西?我感覺pstruct非常接近...

+0

如果你已經有了一些可解析格式的結構,你可以簡單地使用'sed'來爲它們中的每一個生成打印函數。如果您在其中使用C11泛型,則可以獲得更好的結果,因此可能具有類型泛型打印功能。 –

+0

Humpfa。我只有c,這當然是可以解析的,但它是一個真正的包含和定義的c程序,所以這個實用程序應該像編譯器一樣以某種方式在相同的類中運行... – pbhd

+0

您是否想過Perl ['c2ph'](http://perldoc.perl.org/c2ph.html),它曾經來自前體程序'pstruct'? –

回答

1

最好和最精確的方法是依靠編譯器插件接口,就像clang和gcc提供的那樣。基本上,編譯器會調用你的插件在每個有趣的事件(比如遇到聲明)上提供的回調函數,讓你有機會產生必要的包裝器/元數據。其他方法包括gcc-xml(它將產生你的程序的xml表示),swig和任何能夠解析DWARF調試輸出的工具(這就是gdb使用的)。

+0

感謝您的信息,我目前正在忙於檢查gcc的插件功能,認爲這可以做到這一點... – pbhd

相關問題