当我 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 都在生成调试文件中发挥作用。
我正在用两个源文件编译一个非常简单的 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 都在生成调试文件中发挥作用。