c++ - 如何获得仅具有模板的 CPP 文件的程序集等效项

标签 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

有人可以帮忙吗?

最佳答案

模板只有在您实例化该模板的实例时才会转换为代码。除非实例化模板,否则您不会获得模板的任何 asm。

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

template class TemplatedClass<char>;

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


调试模板代码更新

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

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

您的计划是自行重新编译模板,并寻找一段匹配的汇编程序。

您的解决方案将行不通

  1. 需要为特定类型实例化模板,否则它们无法编译
  2. 对于您在 (1) 中选择的每种类型,生成的代码通常会有所不同
  3. 模板代码通常在一个程序中被多次编译,每次都在模板函数调用者的编译单元中。
  4. 由于上述原因,您将找不到与崩溃的汇编代码完全匹配的代码。

不需要你的解决方案

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

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

这样做,然后让它再次崩溃。

我不会说模板调试很容易,但没有比这更容易的了。

关于c++ - 如何获得仅具有模板的 CPP 文件的程序集等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4213850/

相关文章:

c++ - 从非托管 C 程序在 Windows 系统托盘图标上写入文本时如何保持透明度

C++,new vs malloc 返回值

c++ - std::pair 构造函数接口(interface)

c++ - 何时在 C++ 中显式指定模板参数?

c++ - 在泛型类之外定义函数会产生编译错误

linux - 在汇编中使用 printf 会导致管道传输时输出为空,但可以在终端上使用

c++ - 使用 Lua/C++ 设置文件路径

c++ - 在编译时使用模板遍历结构字段

c - 如何用 C 创建我自己的延迟函数

c - 为什么某些内核操作不能用 C 编写