2010-11-18 51 views
3

我有一個C++文件,其中只有模板類的模板方法。我試圖用-S選項編譯它。如何獲得僅具有模板的CPP文件的等效文件

它生成.s文件,但它不具有任何彙編代碼 - 例如:

.section  ".text",#alloc,#execinstr 

.file "eac_slist.C" 
.xstabs ".stab.index","V=9.0;DBG_GEN=5.0.8;dm;cd;backend;ptf;ptx;ptk;ptr/vobs/eam;s;;P;R=5.8<<Sun C++ 5.8 2005/10/13 (ccfe)>>;A=2",60,0,0,0 
.xstabs ".stab.index","/vobs/ossrc_3pp/freeware/studio11/SUNWspro/prod/bin/CC -I. -S -xs eac_slist.C",52,0,0,0 

任何人都可以在這方面的幫助?

+0

你能解釋爲什麼你想爲模板生成asm嗎?這將有助於指導我們的答案。 – 2010-11-18 10:41:06

+0

我在該區域有一個核心轉儲文件。分析核心轉儲我們使用mdb。因此,如果我得到彙編代碼來分析核心轉儲,那麼這將是完整的幫助 – 2010-11-18 11:57:59

+1

可以在覈心或原始程序中找到程序集(以機器代碼形式)。您的調試器應該能夠將它顯示爲程序集。 – 2010-11-18 14:52:25

回答

2

您無法編譯模板。顧名思義,一個模板是不完整的代碼,你需要先用一些類型參數實例化它,然後才能將它編譯爲機器代碼。

嘗試編譯一些使用該模板的代碼。根據類型參數,生成的代碼可能會有所不同。

1

如果您實際上未使用模板化代碼,則不需要編譯器生成任何內容。

7

當您實例化該模板的實例時,模板僅轉換爲代碼。除非實例化它,否則不會獲得模板的任何asm。

然而,你可以要求編譯器爲顯式實例化一個模板的實例:

template class TemplatedClass<char>; 

如果將這樣一行到你的C文件,你會得到的char變異模板的生成的ASM。


調試模板代碼更新

看起來像你的真正的問題是 - 如何找到我的程序崩潰在什麼線我的模板代碼?

這聽起來像你有一個核心文件,你已經指出了地址,並查找了該地址的程序集,現在想知道該程序集的含義。

您的計劃是自行重新編譯模板,並尋找匹配的彙編器。

您的解決方案將無法工作

  1. 模板需要實例化一個特定類型的,否則他們不會編譯
  2. 產生往往會爲您選擇在每個不同類型的代碼(1 )
  3. 模板代碼通常是在程序中多次編譯,每次在編譯模塊函數的調用者單元中進行。
  4. 由於上述原因,您不會找到崩潰彙編代碼的完全匹配。

您的解決方案是沒有必要的

我想你可以複製的崩潰(即它不是你正在尋找一個客戶的核心文件)。

在每次編譯時,通過在gcc的參數中添加符號-g,您將能夠確定程序在哪一行崩潰。

這樣做,然後再次崩潰。

我不會說模板調試很容易,但它並沒有比這更簡單。

相關問題