微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么链接目标文件时我的 pdb 文件缺少符号?

如何解决为什么链接目标文件时我的 pdb 文件缺少符号?

我正在用两个源文件编译一个非常简单的 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;
}

我正在 Windbg 中“调试”该程序,尽管该程序运行良好 - 用于实验。我正在以两种方式使用 VS 2019 的命令行开发人员命令提示符进行编译。在第一种情况下,我通过 CL 运行整个过程:

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

在第二种情况下,我在不链接的情况下进行编译,然后链接目标文件

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

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

解决方法

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

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

我的错误是我认为调试文件仅由链接器生成,而链接器从未看到源文件。相反,编译器和链接器都在生成调试文件中发挥作用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。