如何获得仅具有模板的CPP文件的程序集

时间:2010-11-18 10:35:55

标签: c++ templates assembly

我有一个C ++文件,它只包含模板类的模板方法。我试着用-S选项编译它。

它正在生成.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

有人可以为此提供帮助吗?

3 个答案:

答案 0 :(得分:7)

在实例化该模板的实例时,模板仅转换为代码。除非你实例化它,否则你不会获得模板的任何asm。

但是,您可以要求编译器明确实例化模板的实例:

template class TemplatedClass<char>;

如果您在c文件中放置这样的一行,您将获得为模板的char变体生成的asm。


调试模板代码更新

看起来你真正的问题是 - 如何找到我的程序崩溃的模板代码中的哪一行?

听起来你有一个核心文件,你已经确定了地址,并在该地址查找了程序集,现在想要找出该程序集的含义。

您的计划是单独重新编译模板,并寻找匹配的汇编程序。

您的解决方案不起作用

  1. 模板需要针对特定​​类型进行实例化,否则无法编译
  2. 对于您在(1)
  3. 中选择的每种类型,生成的代码通常会有所不同
  4. 模板代码通常在程序中多次编译,每次都在模板函数调用者的编译单元中。
  5. 由于上述原因,您找不到与崩溃汇编代码完全匹配的内容。
  6. 您的解决方案不是必需的

    我假设您可以复制崩溃(即它不是您正在查看的客户核心文件)。

    通过在每次编译时向gcc的参数添加符号-g,您将能够计算出程序崩溃的行。

    这样做,然后再次崩溃。

    我不会说模板调试很简单,但它没有比这更容易。

答案 1 :(得分:2)

您无法编译模板。顾名思义,模板是不完整的代码,您需要先将其与某些类型参数进行实例化,然后才能将其编译为机器代码。

尝试编译一些使用该模板的代码。根据类型参数,生成的代码可能不同。

答案 2 :(得分:1)

如果您实际上没有使用模板化代码,则不需要编译器生成任何内容。