问题标签 [source-server]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 如何将源代码嵌入 pdb 并让调试器使用它?
注意:我的目标关注点是 C# 使用常规 MSIL 以 CLR 为目标,以防万一有一些东西适用于此但不适用于更一般的情况。
一些现有的源代码调试支持示例
最近发布了 Sourcepack 项目,它允许用户重写 pdb 文件中的源路径以指向不同的位置。当您拥有程序集的源代码但不想尝试将其放入与构建时完全相同的文件系统位置时,这非常有用。
http://lowleveldesign.wordpress.com/2011/08/26/sourcepack-released/
对于开源项目,使用http://www.symbolsource.org/作为让项目用户轻松获取符号和源代码的一种方式是一个绝妙的主意。
问题
但是,经常有项目出于法律或方便的原因,使用这种方法不是很可行。此外,可能正在调试项目的人员可能相对较少或包含在内。
默认情况下,项目的 pdb 包括指向磁盘上文件 (IIRC) 的指针,然后源索引可以添加将指针嵌入源位置的能力(例如,在版本控制系统中),然后使用源服务器实际获取源的指针。
目标
看起来事情可能更简单(对于某些构建,例如调试和/或仅限内部),只需将实际源代码放入 pdb(实际上只是取消引用当前写入 PDB 中的指针)。看起来你可以跳过整个源服务器部分(至少在理论上)并消除对调试时间故事的一些依赖。是否将源存储为压缩在很大程度上是正交的,但为了使现有调试器更容易实现,第一遍可能不会这样做。
由于 PDB-matching-binary 的故事已经很好了,将源放入 PDB 甚至比源服务器指针更好,因为指针可能会随着时间的推移而中断(源控制系统移动,或更改为不同的系统,或无论如何),但位于 PDB 中的实际源代码“永远”是好的。
这与“源服务器”支持有何不同?
(这是在 Tigran 的评论询问有什么好处之后通过编辑添加的)
应该与之比较的“基线”场景是今天使用“正常”源服务器实例的“正常”调试体验。在那种情况下,(AFAIK)调试引擎从 PDB (通过备用流)获取指针,然后使用已注册的源服务器尝试通过该指针获取源。由于给定的程序集通常将包含多个源文件,因此要么有一个包含基本位置的指针,要么在 PDB(或其他东西)中有多个指针,但这应该与本讨论正交。
对于需要隐藏/不可访问源的项目(大多数 Microsoft 产品,例如,包括 Windows、Office、Visual Studio 等),让 PDB 包含指针远优于包含实际源(即使它是加密)。如果没有必要的网络访问和权限,这样的指针是毫无意义的,因此这种方法意味着您可以将 PDB 发送给地球上的任何人,而不必担心他们能够访问您的源(最坏的情况下,他们可以一瞥您的源树是安排好的,我想)。
但是,有 2 组大型项目(特别是构建)不存在这种“隐藏源代码”的好处。
第一个是仅由无论如何都可以访问源代码的人使用的构建。在您自己的机器上完成且永远不会离开该机器的构建就是一个很好的例子,因为攻击者无论如何都需要从您的文件系统中读取文件以获取源代码,因此从一个文件 (.cs) 与另一个文件 (.cs) 读取。 pdb)在攻击难度/向量方面是一个相对较小的差异。同样,完成并推送到测试/登台环境的构建,在该环境中访问机器上 pdb 的人等于或可以“正常”访问源的人的子集。
第二个是(有些明显的)开源项目,其中项目的源代码已经对所有人开放,因此对任何人隐藏源代码没有任何好处。
请注意,这可以相对容易地扩展以包含加密形式的源(因为我们已经在讨论必须存储格式/编码数据),但是增加的复杂性会使这种情况可能不太有用而不仅仅是使用“普通”源服务器。
好处?
有了上面的描述,允许这样做的潜在好处列表包括(但不限于:)这些现在突然出现在我脑海中的东西:
- 无需处理设置源服务器支持。It Just Works (IJW),至少当/如果调试器知道查看 pdb 时。
- 与此同时,你仍然可以做一个“固定”的源服务器,它只是一个提取源并将其反馈给调用者的虚拟服务器。这样的配置可能对每个人都是相同的(例如,使用 localhost),仍然消除了当前实际配置源服务器的需要
- 构建不需要包含“源索引”
- 由于构建会读取源文件并写入 pdb 文件,因此我们只是修改写入 pdb 中的内容,而不会对进行网络调用或读取内存中没有的数据进行任何构建时性能影响。
- 在“原生”构建支持将源代码放入之前,它可能是一个简单的构建后步骤,可能首先通过 Sourcepack 项目的一个小分支实现,因为它已经完成了读取/修改 PDB 文件的工作:)
- 不依赖于拥有源代码控制系统的团队/项目
- 不依赖于被签入源代码控制系统的每个文件的特定版本(大多数人不会签入他们在 IDE 中执行的每个构建)
- 无需访问具有该文件的特定源代码控制系统
- 例如,在 DVCS 情况下,PDB 指针可能指向 git 或 mercurial 或其他任何“随机”实例,不一定是您有权访问的实例
- 用于将该版本跟踪回您有权访问的源代码控制服务器实例(如果它甚至存在)的源服务器工具尚不存在 AFAIK)
- 如果项目死亡(被删除)或移动,没问题
- 例如,如果项目从一个转移到另一个:自托管、sourceforge、github、bitbucket、codeplex、code.google.com 等。
- 如果您正在调试的机器没有(或不足)网络访问权限,则没有问题
- 例如,如果你在一个盒子里做一个“网络 KVM”来调试一个问题,但它要么没有网络,要么只能与断开的网络通信,这样它就无法访问你的源代码控制服务器)。
- 在极端情况下,能够从构建中恢复一些项目源。;)
注意:另一种方法是将源包含在实际程序集中(例如,作为资源),但 pdb 是更好的选择(很容易在没有 pdb 的情况下发布构建,如果源在 pdb 中,则没有正常的运行时性能命中因为程序集是相同的代码和相同的大小等)
如何实施?
从表面上看,这种支持似乎并不难添加,但我觉得这是因为我对所涉及的机制了解得不够多,而不是实际上是一件简单的事情来实施。:)
我的猜测是:
- 添加一个构建后步骤,该步骤将执行类似于 Sourcepack 的操作,但不会更改指针,而是将其替换为实际源代码。
- 根据源服务器需要做什么,它可能需要添加前缀,或者实际源将位于不同的备用数据流中,并且“指针”被更新为“source-in-pdb:ads-foo.cs” ' 管他呢。前缀或指针也可以包括源文件的存储方式(未压缩、gzip、bzip2 等,以及文件的编码)
- 实现一个“源服务器”,它实际上从有问题的 pdb 中提取源并将其返回。
- 不知道源服务器“API”是否有足够的信息来获取 PDB 的位置,更不用说它是否有权实际读取内容。
完整性检查?
随着上面的喋喋不休,问题真的是:
- 这种东西是不是已经存在了?(如果是这样,请提供指点!)
- 假设它还不存在,上述作为第一次实现是否有意义?是否存在上述跳过的陷阱或复杂性?
- 假设上述情况为“否”和“是”,是否存在一个有意义的现有项目(它接近或在其现有范围内)?
git - 使用 Git 进行源索引
我正在尝试在我们的构建服务器(TeamCity)上与 Git 一起使用源索引。
我下载了这个项目:SourceServer-GitExtensions
在运行它时,我注意到警告/错误。深入研究脚本(基于 PERL),我注意到脚本运行这个函数:
这是为了获取存储库的 id(我假设的第一次提交的 id)而运行的。
问题是,我们目前没有使用 master 分支。
我的问题是 - 这是获取“存储库 ID”的正确且可靠的方法吗?我可以运行其他东西来获取“已签出的当前分支”而不是 master 吗?
visual-studio-2010 - 带有 git 的 Visual Studio (Microsoft) 符号服务器
我正在尝试使用 git 设置 Microsoft 符号服务器。我四处寻找,发现了这个
https://github.com/joliver/SourceServer-GitExtensions
我遵循了说明的每一步。
当我尝试调试时,我从 Visual Studio 弹出窗口
我运行了我得到这个错误的命令
不知道出了什么问题。那是因为我有多个分支,我是否必须指定我想在那里获取的特定分支?
这是我用来生成索引的命令
我试图对我的 pdb (SymbolServerTests.pdb) 文件运行这些命令
Srctool.exe SymbolServerTests.pdb
pdbstr -r -p:SymbolServerTests.pdb -s:srcsrv
更新:我想我得到了一些改进。我已将文件签出到此位置。
C:\Users\myusername\AppData\Local\SOURCE~1\bfef70fcb1efef501a09d451517a24f049383e28\04898e9268d374a9a503e4c138b27f01b7553a3e\codetest.cs
但我得到了
Determining whether the checksum matches for the following locations: 1: C:\Users\myusername\AppData\Local\SOURCE~1\bfef70fcb1efef501a09d451517a24f049383e82\26348c09499b843558a4cc676c0d17a83327d56e\codetest.cs Checksum: MD5 {60 d6 36 20 c3 af c8 31 eb 32 50 3f 27 6b 2f d8}校验和不匹配。
pdb 中的校验和是在哪里计算的?
visual-studio-2012 - 在 Visual Studio 2012 中使用自定义源服务器时出错
我已经用源服务器信息索引了一个 PDB 文件。pdbstr 实用程序转储出以下 srcsrv 流:
如您所见,这指示调试器使用 HTTP 网关连接到 Mercurial 服务器。将此 PDB 文件与 WinDbg 一起使用时,调试器会提示我输入基本 HTTP 凭据以访问 repository-srv 并成功显示源文件。(相同的 URL 也可以在浏览器窗口中使用,或者使用 curl 等命令行工具。)
但是,当将此 PDB 文件与 Visual Studio 2012 一起使用时(并在工具 > 选项 > 调试中启用源服务器支持),调试器不会从源服务器解析文件,提示我指向磁盘上的文件,并显示输出窗口中的以下错误:
没有额外的错误信息,所以我不知道如何进一步诊断。我还能做些什么来获得更详细的错误信息,或者我应该采取另一种方法吗?
visual-studio - 在使用带有源服务器信息的 PDB 文件时,如何在 Visual Studio 中调试时打开任意源代码文件?
在我的项目中,我成功地生成了包含 SVN 存储库信息的 PDB 文件。在调试进程时,我可以单击调用堆栈窗口中的任何堆栈帧,它成功地从 SVN 获取相应的源文件并打开它。到目前为止,一切都很好!
现在的问题是,这仅在我尝试通过单击调用堆栈窗口中的堆栈帧来打开源文件时才有效。这意味着我只能获取具有线程当前正在使用的代码的源文件。如果我想打开一个包含文件怎么办?或者在其他代码文件中设置断点?
我尝试右键单击#include "HEADER_FILE.h"
并单击Open Document "HEADER_FILE.h"
,但 Visual Studio 尝试打开磁盘上的文件(不存在)而不是从 SVN 获取它,并且显然无法打开它。
我希望能够打开任何源文件,如何让 Visual Studio 自动从 SVN 获取它?
我正在使用 Visual Studio 2015。
谢谢!
debugging - TFS“源服务器”(似乎)不起作用
我正在尝试调试一个故意在依赖库中引发异常的小型应用程序。我为两者都构建了代码,但我在一个我没有用来构建依赖库的工作站上进行调试。在我的小型构建过程中,我有一个步骤可以为依赖库索引源和发布符号(使用 vNext 构建系统)。
我希望能够调试并进入依赖库的代码。我的期望是标记到 pdb 文件中的索引信息将允许“即时”获取源代码文件。
pdb 文件在 vNext 构建过程中成功上传到源服务器,并且 pdb 文件从我在 Visual Studio 中根据 Debug -> Windows -> Modules 指定的符号缓存目录成功加载。
我的应用程序故意抛出异常,因此调试器将有一些东西要闯入。当它发生时,我看到堆栈跟踪中的代码,所以我知道符号正在正确加载。当我双击堆栈跟踪中的那个条目时,我没有被带到源头。
由于索引信息,我本来希望 Visual Studio 获取源代码,但我看到了一个文件浏览对话框。请注意,我使用的是 Visual Studio 2017。
这是 pdb 文件中的索引信息(显示 pdb 已正确索引):
请注意,我已经编辑了一些信息,这只是我不想透露的路径信息和服务器名称,但它们是正确的。如果VSTSSERVER的值和源代码的值都正确,为什么我调试的时候源代码拉不上来。我不确定源代码路径中的这些数字是什么,而且我没有看到任何登录凭据来登录 tfs 服务器。但是,由于我已经通过使用 Visual Studio 的方式连接到 TFS,我想也许不需要凭据?我的构建过程目前没有标记源......这可能是问题的一部分吗?
我对此有点新(尝试在调试期间使用源信息)。让我知道我是否遗漏了什么,如果我遗漏了,我该如何补救这种情况。
在将 Visual Studio 附加到应用程序之前,我确实选中了 Debug -> Options -> General -> Enable Source Server Support(这是两个子复选框)。
c# - 当源位于源服务器上时,如何在调试已编译的可执行文件时设置断点
大家好,
我的问题是:
在本地计算机上没有任何源的 Visual Studio 2017 中调试二进制可执行文件时,如何设置断点?
设置:
- 安装了 Visual Studio 2017 的 Win 10 PC
- git 作为本地网络中的源存储库
- TeamCity 作为构建服务器也在同一个本地网络中
- TemaCity 在 Visual Studio 中设置为符号和源服务器
过程:
- 代码在本地机器上编写并提交到 git 存储库
- TeamCity 由于提交而构建新的二进制文件
- TemaCity 还索引符号和源文件
问题:
现在我想调试一个特定的二进制构建,看看出了什么问题。我将二进制文件加载到 Visual Studio 并在调试模式下运行它,当出现 unhandelt 异常并且应用程序崩溃时,Visual Studio 会从 TeamCity 下载符号文件和源文件,并显示发生异常的正确位置。
所以按预期工作。
但回到这个问题......当我想调查二进制文件在做什么时,如果它没有崩溃,我该如何设置断点?
在上面的示例中,Visual Studio 仅从源服务器(引发异常的那个)下载一个源文件。有没有办法在 Visual Studio 中浏览此特定构建的完整源代码以设置断点?
windows - 如何使用 SymGetSourceFile api 在事后调试中获取源文件
我想使用 SymGetSourceFile 使用转储文件中的信息从源服务器获取源文件。但是第一个参数是处理的句柄,但在事后我们没有进程,所以它是否意味着仅用于实时调试工具?如何从事后调试工具中使用它?
https://docs.microsoft.com/en-us/windows/win32/api/dbghelp/nf-dbghelp-symgetsourcefile
更新:我尝试使用 IDebugAdvanced3 接口,但获取 HR = 0x80004002 用于 GetSourceFileInformation 调用。
我有已加载此模块和 pdb 的转储。并将模块内的地址 - 0x000000dd6f5f1000 传递给 GetSourceFileInformation