当我 link 目标文件时,为什么我的 pdb 文件缺少符号?

Why is my pdb file missing symbols when I link object files?

我正在用两个源文件编译一个非常简单的 C 程序。

文件 1:

#include <stdio.h>
#include "conv.h"

/* print Fahrenheit-Celsius table
  for fahr = 0, 20, ..., 300 */

int main()
  {
    int fahr;
    float celsius;
    int lower, upper, step;

    lower = 0;          /* lower limit of temperature table */
    upper = 300;        /* upper limit */
    step = 20;          /* step size */

    fahr = lower;
    while (fahr <= upper) {
      celsius = f2c(fahr);
      printf("%d\t%0.2f\n", fahr, celsius);
      fahr = fahr + step;
    }
    return 0;
  }

文件 2:

#include "conv.h"

/* Convert Fahrenheit to Celsius */
float f2c(int fahr) {
    float celsius;
    celsius =  (fahr-32) * (5.0 / 9.0);
    return celsius;
}

/* Convert Celsius to Fahrenheit */
float c2f(int cel) {
    float fahr;
    fahr = cel * (9.0 / 5.0) + 32;
    return fahr;
}

我是 'debugging' windbg 中的程序,尽管该程序 运行 很好 -- 用于实验。我正在以两种方式使用 VS 2019 的命令行开发人员命令提示符进行编译。在第一种情况下,我 运行 整个事情都通过 CL:

cl /Zi /Fd:fahr fahr.c conv.c

在第二种情况下,我在没有 linking 的情况下进行编译,然后 linking 目标文件:

cl /c fahr.c conv.c
cl /Zi /Fd:fahr fahr.obj conv.obj

第一种情况,我在windbg中调试就可以了。我打开可执行文件,设置一个断点,运行 它,然后出现我的源文件。但是当我用第二种方式编译时,windbg 将不再连接到我的源,并且它无法在 fahr.c 和 conv.c 中找到变量。据我所知,除了我 link 的情况外,其他都一样。我错过了什么?

调试文件 (.pdb) 在构建程序的每个部分时分阶段添加。当您编译文件时,编译器会将它们的符号添加到 pdb 文件中(如果您要求的话)。然后,当您 link 文件时,它会向 pdb 文件添加更多符号。我没有得到源文件符号,因为我在编译目标文件时没有生成任何调试数据。修复是:

cl /c /Zi /Fd:fahr fahr.c conv.c
cl /Zi /Fd:fahr fahr.obj conv.obj

我的错误是我认为调试文件只是由 linker 生成的,它从来没有看到源文件。相反,编译器和 linker 都在生成调试文件中发挥作用。