我已将我的团队使用的库放入从TeamCity部署到网络文件夹的nuget包中.我虽然无法调试这段代码!SymbolSource是我读过的一个解决方案,但我更愿意找到一些方法直接从Teamcity访问.pdb /源文件.有谁知道如何做到这一点?
编辑. 当我签'Include Symbols and Source'
入Nuget Pack构建步骤时,除了网络文件夹中的.nupkg文件之外,TeamCity还会创建.Symbol.nupkg..Symbol.nupkg包含src和.pdb文件.
编辑. 我'Include Symbols and Source'
在TeamCity上取消选中并将以下内容添加到我的nuspec文件中:
<files>
<file src="..\MyLibrary\bin\release\MyLibrary.dll" target="lib\net40" />
<file src="..\MyLibrary\bin\release\MyLibrary.pdb" target="lib\net40" />
<file src="..\MyLibrary\*.cs" target="src" />
<file src="..\MyLibrary\**\*.cs" target="src" />
</files>
Run Code Online (Sandbox Code Playgroud)
这在nuget包中添加了我的库的dll,pdb和源文件,并且没有生成.Symbols文件,我认为这只是符号服务器所需要的.
我们的夜间构建过程已经被打破了很长时间,因此它生成的PDB文件的年龄与相应的图像文件相差几个小时.我已经解决了这个问题.
但是,我想开始使用符号服务器,但不能因为必须使用这些年龄不匹配的pdb文件.我通过在windbg中使用.symopt + 0x40方法解决此问题.这意味着我必须手工组织我的所有pdb文件,经过多年的发布后,这就相加了.
我正在寻找一种方法来修改windbg用于标记pdb年龄的机制,并强制它匹配我的图像文件.实用程序ChkMatch执行类似的操作,但是对于pdb签名.开发人员在页面上声明"ChkMatch能够使可执行文件和PDB文件匹配,如果他们有不同的签名但年龄相同(有关PDB签名和年龄的更多信息,请参阅此文章).如果年龄不同,该工具无法生成文件匹配."
我看了一下hexeditor,甚至找到了与年龄相对应的东西,但它必须在内部拉出一些技巧,因为我无法让它工作.
有任何想法吗?
编辑:我不知道这是否有帮助,但在我的特殊情况下,年龄差异是由于不必要地重新连接dll引起的,这也会重新创建PDB文件.但是,我们的构建过程是存储原始dll(在重新链接之前),以及重新链接之后的pdb.我想过以某种方式手工重建这种情况.意思是,强制重新链接DLL,但在两种情况下都保存了pdb.然后我可以对这两个文件进行二进制比较,看看它们是如何变化的.也许运行某种自动执行此操作的修补软件?通过查看我的控制案例中究竟发生了哪些变化,或许我可以对我公司构建过程中保存的DLL和PDB做同样的事情?
编辑:我想出来!!!! 感谢第一个答案的评论之一,我查看了"未记载的Windows 2000 Secrets:A Programmers Cookbook"一书的pdf链接.作者详细介绍了pdb文件格式.正如我之前所说的那样,我已经将pdb加载到十六进制编辑器中,然后翻出一些看起来我的年龄/签名匹配,但它没有用.好吧,在使用W2k秘密书中的实用程序将pdb"爆炸"到包含的流中之后,我发现它们隐藏了对流3中年龄的另一个引用!!!!!!! 一旦我翻过那个,它在windbg中匹配.这太棒了!!!! 非常感谢....这里的符号服务器我来了!
我找到的每一篇文档(参考文献1到5)都讨论了如何使用共享的UNC路径设置符号服务器,然后将正确的设置提供给本地调试器实例(无论是_NT_SYMBOL_PATH还是Visual Studio IDE调试设置) ).
Microsoft提供了一个符号服务器(参考6),可通过http获取其公共符号存储.
我想为我自己的代码创建一个可通过http传输访问的符号服务器,而不是通过UNC文件共享.Mozilla人似乎已经这样做了(参考文献7),但它不再具有功能性.
到目前为止,是否有更好的参考可用于执行此任务?
参考
我读完了这篇文章:设置一个符号服务器,详细介绍了如何为我的团队设置共享符号服务器.
我想知道的是将自己的符号添加到商店中.
我的问题是:我从中获得了什么?
我们假设我有以下构建过程:
如果我添加到上面的第三点,将构建的文件添加到符号存储区的能力,这给了我什么?
如果我创建一个程序,并引用提交到存储库的二进制文件,我同时获得.dll,.pdb和.xml(intellisense支持),所以我的堆栈跟踪似乎已经包含了我需要的所有内容.
这是分发.pdb的替代品吗?
或者仅仅是因为我需要在WINDBG中打开.DMP文件并分析其堆栈,我可能根本没有可执行文件,只有其他人提供的.DMP文件?(也就是说,exectuable可能来自旧版本,我只获得.DMP文件)
我创建了一个powershell脚本,在构建设置为release后,从drop位置获取所有pdb文件,并将它们复制到网络上共享的文件夹中.
我还创建了一个示例应用程序,并添加了包含我需要的程序集的nuget包(没有pdb文件).
我在网上找到了一些引用,但我无法使用pdb文件调试程序集.我正在使用VPN连接来连接到包含pdb文件和Visual Studio 2010的共享文件夹.
为了使用网络上共享的pdb文件能够调试我使用nuget包管理器获得的程序集,我需要做出哪些确切的步骤?
谢谢 !
我在Visual Studio 2008中使用Microsoft Symbol Server,它运行良好.遗憾的是,当公共符号服务器不包含符号时,超时需要一段时间,并且每次启动项目进行调试时,Visual Studio都会尝试重新加载相同的缺失符号.
有什么方法可以让Visual Studio记住"未命中"而不是再打扰一段时间?
我试图弄清楚什么散列算法用于Microsoft符号本地缓存目录.
例如,本地缓存可以是如下所示
L:\Symbols \browseui.dll \44FBC679fe000 browsue.dll \browseui.pdb \44F402F62 browseui.pdb \explorer.exe \3EBF1F14f7000 explorer.exe \explorer.pdb \3EBF1F141 explorer.pdb \msvcr71.pdb \60D915C6AB6A4F3586E9096E2F8856482 msvcr71.pdb
文件与其调试数据库之间似乎存在某种对应关系.除此之外,我无法弄清楚如何生成这些(可能)十六进制字符串文件夹的名称.
其中一些是9位数,大约13位数,其他是33位数.它看起来像一个实际的实时文件(由于某种原因存储在符号缓存中)具有13位哈希,而其(几乎相似)调试数据库获得9位哈希.一些调试数据库获得13位哈希值; 虽然他们没有相应的实时文件,却无法弄清楚是什么让这些特殊.
我已经尝试使用我所知道的各种哈希算法(其中39个)对文件进行哈希处理,并且没有任何匹配(直接向上,反向,备用字节序等)
有任何想法吗?
更新 我想我终于找到了它.来自符号存储格式:
SymStore将文件系统本身用作数据库.它创建了一个大型目录树,其目录名称基于符号文件时间戳,签名,年龄和其他数据.
编辑 Dang,不幸的是它只提到目录名是从各个方面派生的(我猜不是很好的哈希),但并没有提到具体如何.搜索继续...... :-(
我有一个 .NET Standard 2.0TestSouceLink
项目,其配置如下.csproj
:
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
<Authors>Jérôme MEVEL</Authors>
<Description>Just a test package for SourceLink</Description>
<Version>1.1.1</Version>
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<EmbedUntrackedSources>true</EmbedUntrackedSources>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<DebugType>full</DebugType>
<DebugSymbols>true</DebugSymbols>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.SourceLink.Vsts.Git" Version="1.0.0-beta2-18618-05">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
我们有一个 Azure DevOps 服务器,它在构建管道中生成我们的 Nuget 包。
我Publish symbols path
在最后添加了一个任务来将.pdb
文件推送到 Symbol Server,并且我设法让 Source Link 与 Azure DevOps Symbol Server 一起工作,仅使用Debug构建配置。
问题是我不希望在调试模式下生成 Nuget 包中的 DLL。我希望它们是Release。但是当我将dotnet pack
任务更改为Release
在Configuration to package
文本框中使用时,源链接不再起作用。 …
SYMSRV: http://referencesource.microsoft.com/symbols/System.Web.pdb/E6EBD6B61CEA407591438CC4E48036891/System.Web.pdb not found
http://referencesource.microsoft.com/symbols: Symbols not found on symbol server.
SYMSRV: System.Web.pdb from http://msdl.microsoft.com/download/symbols: 131401 bytes
http://msdl.microsoft.com/download/symbols: Symbols downloaded from symbol server.
C:\Users\Micah\Symbols\System.Web.pdb\E6EBD6B61CEA407591438CC4E48036891\System.Web.pdb: Symbols loaded.
Run Code Online (Sandbox Code Playgroud)
注意它是如何无法找到System.Web.pdb
的referencesource.microsoft.com
.它发现它,msdl.microsoft.com
但那些没有源文件/行.我已经下载的源代码System.Web.dll
来自referencesource.microsoft.com
所以我知道源可用.根据我的理解,referencesource.microsoft.com
应该为所有已发布的.NET Framework版本(包括补丁)提供PDB?
的版本System.Web.dll
当前正在加载是发现在GAC标记为版的64位版本4.0.30319.34212
.它的发布日期为5/29/2014.据我所知,这是最新版本System.Web.dll
,但如果我错了,我不介意升级,如果它解决了这个问题.
我对dotPeek符号服务器功能的理解如下:
每当IDE要求调试给定程序集的信息时,dotPeek会将程序集和符号(+反编译的源代码?)反编译回IDE.
但我的经验如下:
配置我的IDE并在调试时检查"输出"窗口后,我看到正在加载所有托管程序集的符号.我可以进入这些库/ .NET平台并在那里调试没有问题.
但是有一个我遇到问题的第三方组装.输出窗口在我的应用程序启动期间打印出来:
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Users\kostas\AppData\Local\Temp\Temporary ASP.NET Files\root\9bc23327\4940c90d\assembly\dl3\8fde229b\401c97fd_0937d001\WebApi.Hal.dll', Symbols loaded.
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试进入WebApi.Hal类时,IDE会要求我提供源代码文件,并输出以下内容:
SRCSRV: The module 'C:\Users\kostas\AppData\Local\Temp\Temporary ASP.NET Files\root\9bc23327\4940c90d\assembly\dl3\8fde229b\401c97fd_0937d001\WebApi.Hal.dll' does not contain source server information.
Run Code Online (Sandbox Code Playgroud)
组态:
选项 - >调试 - >符号:
按此顺序配置三个Symbol服务器
http://srv.symbolsource.org/pdb/Public
http://referencesource.microsoft.com/symbols
选项 - >调试 - >常规截图:
我错过了什么?
symbol-server ×10
c# ×4
.net ×2
nuget ×2
azure-devops ×1
debugging ×1
deployment ×1
dotpeek ×1
hash ×1
http ×1
pdb-files ×1
sourcelink ×1
symbols ×1
symstore ×1
teamcity ×1
tfs ×1
windbg ×1
windows ×1