jet-symbols/src/JetBrains.CommandLine.Symbols/DumpSymbolsFileSignCommand.cs (57 lines of code) (raw):
using JetBrains.Util;
using System;
using System.Collections.Generic;
using JetBrains.Metadata.Debug.Pdb;
using JetBrains.Metadata.Debug.Pdb.Dbi;
using JetBrains.Metadata.Utils;
using JetBrains.Metadata.Utils.PE.Directories;
namespace JetBrains.CommandLine.Symbols
{
public class DumpSymbolsFileSignCommand : DumpFilesSignCommandBase
{
public const string CMD_NAME = "dumpSymbolSign";
public DumpSymbolsFileSignCommand(FileSystemPath outputFilePath, ICollection<FileSystemPath> targetFilePaths)
: base(outputFilePath, targetFilePaths)
{
}
protected override string GetFileSignature(FileSystemPath targetFilePath)
{
if (!targetFilePath.ExistsFile)
{
Console.Error.WriteLine("PDB file does not exists " + targetFilePath);
return null;
}
if (targetFilePath.GetFileLength() == 0)
{
Console.Error.WriteLine("Empty PDB file " + targetFilePath);
return null;
}
if (PdbUtils.GetPdbType(targetFilePath) == DebugInfoType.Windows)
{
using (var pdbStream = targetFilePath.OpenFileForReading())
{
var pdbFile = new WindowsPdbFile(pdbStream);
var dbiStream = pdbFile.GetDbiStream();
var ageFromDbi = 1;
if (dbiStream.Length > 0)
{
var binaryStream = new StreamBinaryReader(dbiStream);
var dbiHeader = new DbiHeader(binaryStream);
ageFromDbi = dbiHeader.PdbAge;
}
var root = pdbFile.GetRoot();
var signature = root.PdbSignature;
return string.Format("{0}{1:X}", signature.ToString("N").ToUpperInvariant(), ageFromDbi);
}
}
var debugInfo = PdbUtils.TryGetPdbDebugInfo(targetFilePath);
if (debugInfo == null)
{
Console.Error.WriteLine("Unsupport PDB file " + targetFilePath);
return null;
}
return string.Format("{0}ffffffff", debugInfo.Signature.ToString("N").ToUpperInvariant());
}
}
}