V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yodhcn
V2EX  ›  程序员

如何断点调试被 .exe 程序调用的 C# 类库?

  •  
  •   yodhcn ·
    yodhcn · 2022-04-26 12:07:26 +08:00 · 2452 次点击
    这是一个创建于 940 天前的主题,其中的信息可能已经有所发展或是发生改变。

    楼主在尝试开发一个 jellyfin 插件,按照官方文档 https://github.com/jellyfin/jellyfin-plugin-template 配置环境,在调试时 Visual Studio 却提示"当前不会命中断点, 还没有为该文档加载任何符号"。
    搞得一头雾水,恳请大佬能帮楼主捋一捋,到底是哪里出了问题。

    环境:
    便携版的 jellyfin 路径在 D:\jellyfin
    被调试插件源码路径在 C:\Users\admin\Documents\GitHub\jellyfin-plugin-template
    jellyfin 插件文件夹路径在 从 C:\Users\admin\AppData\Local\jellyfin\plugins
    使用 Visual Studio 2022 调试代码

    操作步骤:

    1. 按照文档的步骤 https://github.com/jellyfin/jellyfin-plugin-template#6a-set-up-debugging-on-visual-studio 将 D:\jellyfin\jellyfin.exe 设为 "启动项目"
      并在 Debug 模式下生成 Jellyfin.Plugin.Template.dll 文件
    2. 将 jellyfin-plugin-template\Jellyfin.Plugin.Template\bin\Debug\net6.0 文件夹下的内容全部复制到 jellyfin 的插件文件夹 C:\Users\admin\AppData\Local\jellyfin\plugins\Template
      设置断点
      点击 "启动" 开始调试

    结果就是上图的那样,根据 Jellyfin 的日志,插件 Jellyfin.Plugin.Template.dll 已被正确加载,但在 Visual Studio 的源码上却没有命中断点。

    我相信这实际上是一个 "visual studio 如何断点调试被 .exe 程序调用的 C# 类库?" 的问题,也查了 visual studio 文档 https://docs.microsoft.com/zh-cn/visualstudio/debugger/how-to-debug-from-a-dll-project?view=vs-2022

    但觉得这和 jellyfin 的文档 https://github.com/jellyfin/jellyfin-plugin-template 有些出入,也可能是楼主对两个文档都没有正确理解,所以还是来这里请有经验的人帮忙了。

    第 1 条附言  ·  2022-04-26 19:11:12 +08:00
    模块 Jellyfin.Plugin.Template.dll 的

    "符号加载信息":
    此模块是 ngen.exe 工具创建的预编译二进制文件。调试器不会尝试为这些二进制文件加载符号,而是在由 .NET 运行时加载时,为原始 dll/exe 加载符号。

    "符号状态":
    本机调试器跳过为托管模块加载符号。

    正常不应该是这样的吧?模块符号没有正常加载?
    11 条回复    2022-04-26 19:33:31 +08:00
    ysc3839
        1
    ysc3839  
       2022-04-26 13:06:07 +08:00 via Android
    调试器类型要选择“托管”(Managed),开始调试后,去模块列表找到你的 DLL ,确保调试符号已经加载
    userforg2021
        2
    userforg2021  
       2022-04-26 13:48:23 +08:00
    试试插件入口点加一句
    System.Diagnostics.Debugger.Launch();
    然后不使用 VS 调试,直接启动软件,正常情况下会弹出选择框让你选 VS 实例,选择打开了源码的 VS 就行了。
    7075
        4
    7075  
       2022-04-26 14:02:49 +08:00
    attach
    Blackricky
        5
    Blackricky  
       2022-04-26 14:13:40 +08:00
    附加到进程?
    yodhcn
        6
    yodhcn  
    OP
       2022-04-26 16:06:03 +08:00
    @min 我有把生成的 .dll 文件 和相应的 .pdb 文件一同复制到 jellyfin 插件文件夹
    yodhcn
        7
    yodhcn  
    OP
       2022-04-26 16:13:40 +08:00
    @ysc3839
    抱歉,能说得具体一点吗?
    下图是 visual studio "调试>窗口>模块" 的截图
    https://cdn.jsdelivr.net/gh/hututu-tech/IMG-gongfeng@main/2022/04/26/6267a77a9a37b.png
    符号状态:本机调试器跳过为托管模块加载符号。
    ysc3839
        8
    ysc3839  
       2022-04-26 18:18:25 +08:00
    @yodhcn 看图感觉是调试器类型没选托管
    wudicgi
        9
    wudicgi  
       2022-04-26 19:01:47 +08:00
    如果你的 dll 文件和 exe 程序在同一解决方案内,那么一种简单的调试方法是,将 dll 的项目设为启动项目,同时配置启动的命令行为那个 exe 程序的完整路径
    hackfly
        10
    hackfly  
       2022-04-26 19:25:34 +08:00
    没加载符号,看不到代码内容的也调试不了。这还不如在 od 反汇编;在模块窗口,选中 DLL ,右键加载符号,看能不能加载符号
    yodhcn
        11
    yodhcn  
    OP
       2022-04-26 19:33:31 +08:00
    @hackfly 你看我的 "第 1 条附言"
    不是找不到符号,而是不知为何跳过了符号的加载
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1058 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 47ms · UTC 19:26 · PVG 03:26 · LAX 11:26 · JFK 14:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.