首页 > 数据库 >新的pdb2mdb.exe

新的pdb2mdb.exe

时间:2023-04-12 21:45:53浏览次数:50  
标签:exe name mdb dll pdb2mdb output path

    之前做Unity3d脚本分离的时候遇到的问题,当pdb文件特别大或者其它一些未知情况时,会导致pdb无法正确转成mdb,这会导致mono脚本无法调试,报错为:

Microsoft.Cci.Pdb.PdbDebugException: Invalid signature. (sig=1919117645) in Microsoft.Cci.Pdb.PdbFile.LoadFuncsFromDbiModule(BitAccess bits, DbiModuleInfo info, IntHashTable names, ArrayList funcList, Boolean readStrings, MsfDirectory dir, Dictionary`2 nameIndex, PdbReader reader) in Microsoft.Cci.Pdb.PdbFile.LoadFunctions(Stream read, BitAccess bits, Boolean readAllStrings) in Pdb2Mdb.Driver.Convert(AssemblyDefinition assembly, Stream pdb, MonoSymbolWriter mdb)

    经过一些调试,发现本身可能是由于mono自带的和unity自带的pdb2mdb都太老了,很多新东西都不支持了。所以我自己建了个github项目,然后尝试找到pdb2mdb的源代码,接着尝试将其所有的依赖项都升级到最新,然后再将不兼容的代码都改了。这样就有了一个新的pdb2mdb,使用这个新的pdb2mdb就可以转之前不能转的pdb了。

github地址:https://github.com/bodong1987/pdb2mdb

   出于安全考虑,建议使用脚本来包装一下,先尝试使用旧的pdb2mdb转一下,如果转成功了就继续;没转成功就用我的新的pdb2mdb来转,这样应该就最安全稳当了:

def _process_mdb_new(script_directory, output_path, project_name, dll_name) :
    pdb2mdb_path = os.path.join(script_directory, "pdb2mdb.exe")            
    subprocess.call([pdb2mdb_path, output_path])
    print("[new]convert " + dll_name +".dll.pdb to " + dll_name + ".dll.mdb ...")


# other codes
 if(sys.platform == "win32") :
        # convert pdb to mdb
        script_directory = os.path.dirname(os.path.realpath(__file__))

        Enable_Traditional_Converter = True

        if(Enable_Traditional_Converter) :
            pdb2mdb_path = os.path.join(script_directory, "pdb2mdb_traditional.exe")

            output_mdb_path = output_path + ".mdb"
            if(os.path.exists(output_mdb_path)) :
                os.remove(output_mdb_path)

            try :            
                exit_code = subprocess.call([pdb2mdb_path, output_path])
                if(exit_code == 0 and os.path.exists(output_mdb_path)) :
                    print("[traditional]convert " + project_name +".dll.pdb to " + project_name + ".dll.mdb ...")
                else :
                    # print("@warning: do you see an error report? don't warry, I will convert pdb to mdb by a new pdb2mdb.exe, this exe is created by me. please ignore this error now.")
                    _process_mdb_new(script_directory, output_path, project_name, dll_name)
            except :            
                _process_mdb_new(script_directory, output_path, project_name, dll_name)
        else :
            _process_mdb_new(script_directory, output_path, project_name, dll_name)

    不过需要注意的是旧版的pdb2mdb需要魔改一下,否则会有一些问题,比如说当其抛出异常的时候,会自行消化掉,进程并不会返回非0值,所以外部的python可能无法发现它失败了。所以这种情况下,要么魔改一下pdb2mdb,或者检查一下目标mdb是否正常产生即可。

标签:exe,name,mdb,dll,pdb2mdb,output,path
From: https://www.cnblogs.com/bodong/p/17311382.html

相关文章

  • MSBUILD : error MSB3428: Could not load the Visual C++ component "VCBuild.exe".
    完整报错信息:MSBUILD:errorMSB3428:CouldnotloadtheVisualC++component"VCBuild.exe".Tofixthis,1)installthe.NETFramework2.0SDK,2)installMicrosoftVisualStudio2005or3)addthelocationofthecomponenttothesystempathifit......
  • SPRING ThreadPoolTaskExecutor示例
    0、前言当我们需要实现并发、异步等操作时,通常都会使用到ThreadPoolTaskExecutor。它是springcore包中的,而ThreadPoolExecutor是JDK中的JUC。ThreadPoolTaskExecutor是对ThreadPoolExecutor进行了封装处理。1、示例1.1、配置类importorg.springframework.context.annotation......
  • 以阿里巴巴推荐的使用 ThreadPoolExecutor 构造函数自定义参数的方式来创建线程池
    importjava.util.concurrent.ArrayBlockingQueue;importjava.util.concurrent.ThreadPoolExecutor;importjava.util.concurrent.TimeUnit;publicclassThreadPoolExecutorDemo{privatestaticfinalintCORE_POOL_SIZE=5;privatestaticfinalintMAX......
  • 80端口ntoskrnl.exe占用
    1.运行'netstat-ano|findstr80'发现80端口被pid=4的进程占用2.打开任务管理器,发现pid=4的进程,其实是system进程,其对应的进程描述是NTkernel&system。http协议里的某个进程占用了80,但是在任务管理器显示的是System,这个进程显式停止是无法停止的,只有在cmd.exe里使用netstopht......
  • web网站使用indexedDB缓存大数量案例
    前言及背景indexedDB是html5标准引入的web数据持久化方案之一,现代浏览器大多按照标准对其进行了实现,我在新的项目中用到它来作为持久化数据存储,由于最近在web端项目,每次web前端需要实时计算中间成果预计18G的中间过度数据,预计最终每次生成200M以上的结果数据,在此过程耗时30多......
  • 【Java 线程池】【四】ThreadPoolExector中的Worker工作者原理
    1 前言上一节我们看了ThreadPoolExecutor线程池的execute内部方法流程,addWorker方法流程,看到Worker是线程池内部的工作者,每个Worker内部持有一个线程,addWorker方法创建了一个Worker工作者,并且放入HashSet的容器中,那么这节我们就来看看Worker是如何工作的。2  内部属性我们......
  • 在win10下用pyinstaller 包成.exe win7运行报错error loading Python DLL
    在win10下运行一切正常,复制到win7电脑运行,直接报错,有两个错误,一个是缺少xxxxx.dll一个是errorloadingPythonDLL......正常思路以为是缺少dll,按照提示名称下载dll放到系统目录,没啥用。最后搜索一大堆论坛,找到如下思路:原因为win7系统中缺少运行库,需要安装VisualStudio201......
  • Jmeter 启动时报错:Not able to find Java executable or version. Please check your
    安装java环境,cmd窗口中执行java-version可以看到java的版本信息。双击jmeter启动文件,报错:NotabletofindJavaexecutableorversion.PleasecheckyourJavainstallation解决办法:在启动文件jmeter.bat中添加java的环境信息SETJAVA_HOME=D:\Ksoftware\openjdk-19.0.2_w......
  • dotnet-exec 让 C# 程序更简单【转】
    Introdotnet-exec是一个可以执行C#程序而不需要项目文件的命令行工具,并且你可以指定自定义的入口方法不仅仅是Main方法在python/NodeJs里,可以使用pythonxx.py/nodexx.js来运行代码,在C#中一般是需要项目文件才能dotnetrun运行代码,这对于一些比较简单的代码来说会显得麻......
  • Java中创建线程的方式以及线程池创建的方式、推荐使用ThreadPoolExecutor以及示例
    场景Java中创建线程的方式有三种1、通过继承Thread类来创建线程定义一个线程类使其继承Thread类,并重写其中的run方法,run方法内部就是线程要完成的任务,因此run方法也被称为执行体,使用start方法来启动线程。2、通过实现Runanle接口来创建线程首先定义Runnable接口,并重写Runnab......