代码之家  ›  专栏  ›  技术社区  ›  Collin Dauphinee

xperf无法加载我的dll符号

  •  1
  • Collin Dauphinee  · 技术社区  · 16 年前

    我试图使用xperf来分析我的dll,但它拒绝使用我的dll的pdb文件。 在带有-symbols的.etl上运行xperf,我得到:

    DBGHELP: mydll- private symbols & lines
             C:\mydll\debugu\mydll.pdb - unmatched
    

    这使我相信它认为我的pdb与应用程序正在使用的dll不匹配。这是错误的;它确实匹配。我已经使用procexp确认了应用程序链接的dll的路径,完全重建了项目,等等。它仍然认为它不匹配。

    有什么问题吗?

    3 回复  |  直到 10 年前
        1
  •  2
  •   sschilz    16 年前

    请尝试将系统环境变量'u nt_symbol_path'设置为指向.pdb文件'u nt_symcache_path'以指向C:\ symbols。有关xperf符号处理的文档,请参见 http://msdn.microsoft.com/en-us/library/ff191023(VS.85).aspx

    在windowsitpro.com上还有一篇很好的博客文章,标题是“在xperf的封面下”,其中介绍了提交xperf的符号。

    注意,我需要用正确的值设置系统环境变量,xperfview没有选择在批处理文件中设置环境(启动xperfview后立即选中“检查跟踪”、“配置符号路径”菜单选项)

        2
  •  2
  •   Collin Dauphinee    16 年前

    对不起,我问了这个问题却忘了。

    实际上有两个问题。

    第一个是xperf实际上使用了我的符号的旧缓存版本。已通过从符号缓存中删除它来修复此问题。

    第二个问题是,当我在xperfview中加载符号时,它实际上并没有将最新的pdb放入符号缓存中。不过,pdb在我确认包含在symbol路径变量中的目录中。不幸的是,我不记得确切的命令用来解决这个问题,但我相信它是一个' xperf file.etl-符号 '变体。该命令正确地解析了etl,并在遇到相关符号时加载/缓存了它们。之后,xperfview可以正确地显示我的符号。

    请注意,每当pdb发生更改时,我都必须重新运行该命令,因为xperfview仍然不会触及符号缓存中没有的任何内容。我仍然不知道为什么它会在我的机器上这样,其他人似乎没有这个问题。

        3
  •  1
  •   Community Mohan Dere    9 年前

    我刚发了一个 answer 一个类似的问题,所以可能与这里遇到的问题有关…

    基本上,如果动态加载dll,它会给xperf在符号加载方面带来麻烦。

    就我个人而言 猜测 它是关于xperf中的逻辑决定 是否还要尝试 加载给定模块的符号。例如,“加载所有的exe和它们的iat条目”(这将跳过所有的动态dll-看起来不是这样的,但是类似的事情正在发生)

    编辑:

    我最近和一个同事讨论过这个问题,并了解到xperf将正确地“决定”为以编程方式加载的dll加载符号… 如果 在进程结束之前,该dll一直处于加载状态。

    所以,对于加载了 在执行期间卸载,在终止时卸载…xperf将跳过加载这些符号的尝试。