显示EXE,DLL或PDB文件中指定函数的Parameter和local variables信息

RFdiffusion pdb文件处理函数 函数,用于读取 PDB 文件并提取特征。主要处理步骤包括解析 PDB 文件、零中心化、生成 27 原子表示等。 阅读详情

//============================================================================

// LFVars : A small tool used to display function symbol informaton from EXE, DLL or PDB files

//         L(ist)F(untion)Vars: list function parameters and local variabls.

// Author : zyq654321 --- Oct, 2004

// Comment: This is only a sample code to show you how to dump symbol information,

//          you can improve it and your advise is appreciated.

#include <windows.h>

#include <TCHAR.h>

#define _NO_CVCONST_H // We should define the constant in order to ...

#include <dbghelp.h>

#include <stdio.h>

 

#pragma comment( lib, "dbghelp.lib" )

 

BOOL CALLBACK LFVarsCallback( SYMBOL_INFO* pSymInfo, ULONG SymbolSize, PVOID UserContext )

{   

     if( pSymInfo != 0 )

     {

         // Increase the counter of found local variables and parameters

         if( UserContext != 0 )

              *(int*)UserContext += 1;

         // list parameters or variables

         _tprintf(_T("Name: %s /n"),pSymInfo->Name);

         _tprintf(_T("    Type: %s   "),

                         (pSymInfo->Flags & SYMFLAG_PARAMETER) ? "Function Parameter" :

                         ( (pSymInfo->Flags & SYMFLAG_LOCAL)? "Local Variable": "Unknown"));

         TCHAR tcsReg[10];

         switch(pSymInfo->Register)

         {

         case 17:

              _tcscpy(tcsReg,_T("[EAX]"));

              break;

         case 18:

              _tcscpy(tcsReg,_T("[ECX]"));

              break;

         case 19:

              _tcscpy(tcsReg,_T("[EDX]"));

              break;

         case 20:

              _tcscpy(tcsReg,_T("[EBX]"));

              break;

         case 21:

              _tcscpy(tcsReg,_T("[ESP]"));

              break;

         case 22:

              _tcscpy(tcsReg,_T("[EBP]"));

              break;

         case 23:

              _tcscpy(tcsReg,_T("[ESI]"));

              break;

         case 24:

              _tcscpy(tcsReg,_T("[EDI]"));

              break;

         default:

              _tcscpy(tcsReg,_T("Unknown"));

              break;

         }

         _tprintf( _T("Register: %s  "), tcsReg );

         UINT uMax = 0xFFFFFFFF;

         _tprintf( _T("Address(Offset): %c0x%X   "),

                    (LONG)pSymInfo->Address >= 0? ' ' : '-',

                   (LONG)pSymInfo->Address >= 0? pSymInfo->Address : (uMax - pSymInfo->Address + 1));

         _tprintf( _T("Size: %d /n"), pSymInfo->Size);

 

         //ShowSymbolDetails( *pSymInfo );

     }

 

     return TRUE; // Continue enumeration

}

 

int main( int argc, const TCHAR* argv[] )

{

     if(argc < 3)

     {

        goto FAILED_PARAM;

     }

 

     // Set debug options

     DWORD dwOpn = SymGetOptions();

     dwOpn |= SYMOPT_DEBUG;

     SymSetOptions(dwOpn);

 

     // Initilaize the symbol handle for the current process

     if(!SymInitialize( GetCurrentProcess(), 

                                    NULL,                

                               FALSE ))  

     {

         _tprintf(_T("Failed when SymInitialize():%d/n"), GetLastError());

         return 0;

     }

 

     if( argv[1] == NULL || argv[2] == NULL)

     {

         goto FAILED_PARAM;

     }

 

     //------------------------------------------------------------------------

     // Set initial parameters

     TCHAR pszExt[MAX_PATH];

     _tsplitpath( argv[1], NULL, NULL, NULL, pszExt );

     DWORD64 dw64Base     = 0; // if the image is a .pdb file, dw64Base cannot be zero.

                               // if the value is zero, the library obtains the load address

                               //  from the symbol file.

     DWORD   dwFileSize = 0; // if the image is a .pdb file, dwFileSize cannot be zero.

                                   // if the value is zero, the library obtains the size

                               //  from the symbol file.

 

     _tcslwr(pszExt);

     if(_tcsicmp(pszExt, _T(".pdb")) == 0)

     {

         // this is a .pdb file, and so we should set the load address and file size;

         dw64Base = 0x10000000;

         // get the file size

         HANDLE hFile = CreateFile( argv[1], GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL );

         if( INVALID_HANDLE_VALUE == hFile )

         {

              _tprintf(_T("Failed when open %s: %d"), argv[1], GetLastError());

              goto FAILED_PARAM;

         }

         if( INVALID_FILE_SIZE == ( dwFileSize = GetFileSize(hFile, NULL) ))

         {

              _tprintf(_T("Failed when read the size of %s: %d"), argv[1], GetLastError());

              goto FAILED_PARAM;

         }

         CloseHandle(hFile);

     }

 

     //------------------------------------------------------------------------

     // Load symbol table

     _tprintf(_T("Load %s...../n"), argv[1]);

     DWORD64 dw64ModAddress = SymLoadModule64( GetCurrentProcess(),

                                                     NULL,              

                                                     argv[1],          

                                                     NULL,              

                                                     dw64Base,         

                                                     dwFileSize);

 

     if( dw64ModAddress == 0 )

     {

         _tprintf(_T("Failed when SymLoadModule64(): %d /n"), GetLastError());

         return 0;

     }

     _tprintf(_T("Load Address: %I64x /n"), dw64ModAddress);

 

     //------------------------------------------------------------------------

     // Display the function parameters and local variables according to the

     //  specified function name.

     SYMBOL_INFO symInfo;

     symInfo.SizeOfStruct = sizeof(SYMBOL_INFO);   

     if(! SymFromName( GetCurrentProcess(),

                         argv[2],           

                         &symInfo) )

     {

         _tprintf( _T("Failed When SymFromName(): %d /n"), GetLastError() );

         goto FAILED_AFTER_LOAD;

     }

 

     // We only need functon symbol

     if( symInfo.Tag != SymTagFunction )

     {

         _tprintf( _T("Invalid Function Name or Not Found./n") );

         goto FAILED_AFTER_LOAD;

     }

 

     // List funtion's parameters and its local variables

     IMAGEHLP_STACK_FRAME stackFrm;

     stackFrm.InstructionOffset = symInfo.Address;

     if(!SymSetContext( GetCurrentProcess(),

                         &stackFrm,                

                         0 ))

     {

         _tprintf( _T("Failed when SymSetContext: %d /n"), GetLastError() );

         goto FAILED_AFTER_LOAD;

     }

 

     int nVarsCnt = 0;

     if(!SymEnumSymbols( GetCurrentProcess(),

                            0,                  

                            0,                  

                            LFVarsCallback, 

                            &nVarsCnt ) )

     {

         _tprintf( _T("Failed when SymEnumSymbols(): %d /n"), GetLastError() );

         goto FAILED_AFTER_LOAD; 

     }

 

     _tprintf( _T("%d function parmeters and local variables had been listed./n"), nVarsCnt );   

 

 

FAILED_AFTER_LOAD:

     //------------------------------------------------------------------------

     // Unload symbols table

     if(!SymUnloadModule64( GetCurrentProcess(), dw64ModAddress ))       

     {

         _tprintf( _T("Failed when SymUnloadModule64() : %d /n"), GetLastError() );

     }

 

     if(!SymCleanup(GetCurrentProcess()))

     {

         _tprintf(_T("Failed when SymCleanup(): %d /n"), GetLastError());

         return 0;

     }

 

 

     return 0;

 

FAILED_PARAM:

     _tprintf(_T("Failed Parameter!/n"));

     _tprintf(_T("Usage: LFVars -filename -function_name/n"));

     _tprintf(_T("filename: a EXE, DLL or PDB file/n"));

     return 0;

}
“PDB是什么文件? C#“ - 解析PDB文件以获取调试信息 在C#中,PDB文件包含与源代码编译后的可执行文件(如DLL或EXE)关联的调试信息。本文将详细介绍PDB文件的作用、如何生成PDB文件以及如何使用它们来调试C#代码。PDB文件是用于存储C#可执行文件的调试信息的文件格式。熟练使用PDB文件和调试器是成为一名高效的C#开发人员的重要技能之一。PDB文件包含了与源代码对应的调试符号信息,这些信息可以帮助开发人员在调试过程中定位和修复错误。在C#中,生成PDB文件的方式取决于使用的编译器和设置。一旦生成了PDB文件,就可以在调试过程中使用它来定位和修复错误。 阅读详情

相关推荐

是否可以从使用dbghelp库获得的地址中读取值并将其写入地址

我有一种情况是,我使用dbghelp库获取变量的地址。我先加载符号,然后使用SymFromName获取变量的地址。现在我有一个独立运行的exe,其中我必须设置变量的值我可以设置并获取...的值吗?

具有PWM控制VSC-HVDC链路的IEEE30总线传输系统(Simulink仿真实现)

内容概要:本文构建了一个包含PWM控制VSC-HVDC链路的IEEE30节点电力传输系统,并基于Simulink平台完成了系统的建模仿真。该模型聚焦于高压直流输电(HVDC)技术在区域电网互联中的应用,采用电压源型换流器(VSC)与脉宽调制(PWM)技术实现高效、灵活的电能传输。研究重点在于分析VSC-HVDC链路在复杂多节点电网中对潮流分布、系统稳定性及电能质量的调控能力,特别关注其在区域电网互联、新能源大规模接入以及跨区域电力交换等场景下的动态响应特性与控制性能,为现代智能电网的发展提供技术支撑与仿真验证手段。; 适合人群:具备电力系统、电气工程或自动化等相关专业背景的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于研究VSC-HVDC在多节点电网(如IEEE30节点)中的建模与仿真方法;②分析PWM控制策略下HVDC链路对电网潮流分布、电压稳定性和故障穿越能力的影响;③为区域电网互联、新能源并网及智能电网调度等课题提供仿真基础和技术验证。; 阅读建议:此资源以Simulink仿真实现为核心,建议读者在掌握电力电子技术和电力系统分析基础知识的前提下,结合仿真模型深入理解VSC-HVDC的工作原理与控制策略。在学习过程中,应着重关注模型参数设置、控制环路设计及仿真结果的分析,以达到理论与实践相结合的目的。

KEIL5软件实现查看各个模块的寄存器

下图为:Debug选项中Dialog DLL和Parameter默认设置。

weixin_75034744的博客 1816

从零开始学8个基本门电路图:手把手教学

通过清晰的图解和实操步骤,深入解析8个基本门电路图的工作原理与搭建方法,帮助电子初学者快速理解数字逻辑电路的核心基础,轻松迈入硬件设计大门。

weixin_35749440的博客 1169

BitLocker恢复密钥丢失?从原理到实战的完整解锁与系统重生指南

磁盘加密技术是数据安全的核心防线,它通过对存储设备上的数据进行编码,确保未经授权的用户无法访问。其原理主要基于加密算法(如AES)与密钥管理机制,在操作系统启动前或数据读写时进行实时加解密。这项技术的核心价值在于防止设备丢失或被盗后的数据泄露,尤其对于笔记本电脑和移动设备至关重要。典型的应用场景包括企业办公电脑、存有敏感信息的个人设备以及符合合规性要求的行业。当使用Windows系统自带的BitLocker加密功能时,若因硬件改动、系统更新等触发保护机制,用户可能会面临需要输入恢复密钥才能启动的困境。本文聚

weixin_34006965的博客 494

通过符号文件获取函数地址

//通过符号文件获取函数地址 #include #include #include #include #include "ntdll.h" #pragma comment(lib,"dbghelp.lib") //获取函数地址PDB ULONG_PTR GetFunctionAddressPDB(HMODULE hMod, const WCHAR * szApiName) {

125096 3645

相控阵雷达“相控”原理---多张动画示意图完美解释

很容易就能发现,相控阵雷达的天线由无数个小单元天线组成,这些小单元天线叫做“阵元”,对于有源相控阵雷达来说,每一个阵元都是独立控制的,它们既能独立发射雷达波,也能接收雷达波的回波信号。相控阵雷达可以在1秒内关机,1秒内开机,好处是,当军舰遇到依靠雷达信号进行引导的“反雷达导弹”时,可以迅速地把朝向来袭导弹方向的雷达关机,同时,其他方向的雷达保持开启。在过去,军舰上安装有不同种类的雷达,体积庞大、重不说,另一个麻烦是干扰,常常是,一种雷达工作时,另一种雷达就会受到干扰,严重的甚至不能同时工作。

muyangjun的专栏 1万+

显示EXEDLL或PDB文件中指定函数的Parameter和local variables信息

显示EXE,DLL或PDB文件中指定函数的Parameter和local variables信息//============================================================================// LFVars : A small tool used to display function symbol informaton

1233

11.11华为OD机试真题 新系统 - 管线同类区段归并 (Java/Py/C/C++/Js/Go)

11.11华为OD机试真题 新系统 - 管线同类区段归并 (Java/Py/C/C++/Js/Go)

算法大师! 125

【Qwen2微调实战】LLaMA-Factory框架对Qwen2-7B模型的微调实践

在人工智能的浪潮中,大型语言模型(LLMs)正逐渐成为研究和应用的热点。它们在自然语言处理(NLP)的各个领域,如文本生成、翻译、问答等任务中展现出了卓越的能力。Qwen2-7B模型,作为该领域的佼佼者,不仅因其庞大的参数量和强大的表示能力受到关注,更因其在微调后能够更好地适应特定任务而备受关注。本文将详细介绍如何利用LLaMA-Factory这一高效的微调框架对Qwen2-7B进行微调,以期达到提升模型在特定任务上的表现。

寻道AI,探索AI无限可能! 2万+

PDB文件详解

PDB文件的介绍 PDB(Program Data Base),意即程序的基本数据,是VS编译链接时生成的文件。DPB文件主要存储了VS调试程序时所需要的基本信息,主要包括源文件名、变量名、函数名、FPO(帧指针)、对应的行号等等。因为存储的是调试信息,所以一般情况下PDB文件是在Debug模式下才会生成。 PDB文件的调用过程 模块(Module),EXE和DLL...

weixin_30802171的博客 4749

9、 量子支持向量机:从经典到量子的跨越

本文详细介绍了量子支持向量机(QSVM)的基本原理及其在PennyLane和Qiskit框架中的实现方法。从经典SVM的基础知识出发,逐步深入到量子领域的应用,包括如何定义量子核函数、与scikit-learn集成以及在模拟器和实际量子计算机上的训练和评估过程。最后通过表格和流程图总结了不同框架下的实现要点,为未来量子机器学习的研究提供了参考。

weixin_42433737的博客 185

偶识PDB文件

作为一名小白,我也是在遇到问题的时候才了解到了PDB文件。就是在一次重装系统后,我执行代码的时候出错了,告诉我无法打开PDB文件。 最后发现了是在编译的时候,程序所依赖的动态链接库也会被编译,编译过程中每个 dll 都会产生一个pdb文件,又称为“符号文件”,是一个存储数据的信息文件,其包含 dll 库在编译过程的某些调试信息,例如程序中所用到的全局变量、局部变量、函数名以及他们的入口地址等动态库无法找到PDB文件。所以就出现找不到PDB文件的问题。最后我通过在网上寻求帮助,找了 打开VS2013,点击菜

wnx_hh的博客 408

ERROR: Could not install packages due to an OSError: [Errno 2] No such file or directory解决方案

本文主要介绍了ERROR: Could not install packages due to an OSError: [Errno 2] No such file or directory解决方案,希望能对使用Python的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 11万+

华为MetaERP在财务模块(GL/AP/AR/FA)及子账模块效率优化、月末关账加速、与外部系统对账方面,已形成一套**“并行+实时+智能化”**的完整技术方案

华为MetaERP推出"并行+实时+智能化"技术方案,显著提升财务模块效率:1)采用三级并行策略和内存计算,使子账模块单任务处理时间从142分钟降至9分钟;2)通过并行关账架构将月末关账时间从68小时压缩至7.2小时;3)运用AI智能对账提升效率50%,并支持异步流程和区块链审计。典型场景测试显示月结耗时下降89%,CPU利用率提升116%。方案建议分阶段实施,注意依赖分析、任务粒度设计和性能监控,避免过度并行。该方案已有效解决大型集团财务处理效率低、关账慢、对账难等痛点。

金牌架构师 562

warning LNK4099 未找到 PDB“vc90.pdb”……

帖子链接: http://topic.youkuaiyun.com/u/20070604/11/7dfb11ac-768f-4049-b75e-8dc572e77c9d.html 警告: Linking with DDK linker... libcid.lib(streamb.obj) : warning LNK4099: PDB 'libcid.pdb' was not found with 'D:/Program Files/WINDDK/2600/lib/wxp/i386/libcid.lib' or

Nicole的成长 5128

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

PDB 文件

PDB 文件 什么是 PDB 文件 PDB (Program Data Base) 即程序的基本数据,是 VS 编译链接时生成的文件,每个程序集(EXE 或 DLL)都有一个与之对应的 PDB 文件。DPB 文件主要存储了 VS 调试程序时所需要的基本信息,主要包括源文件名、变量名、函数名、对应的行号等等。因为存储的是调试信息,所以一般情况下 PDB 文件是在 Debug 模式下才会生成。...

Iron 的博客 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

利用PDB文件获取未导出全局变量、函数等信息

方法来源于对Sysinternals的procexp的逆向。 在通过kernel的pdb获取未导出的MmSizeOfPagedPoolInBytes和MmMaximumNonPagedPoolInBytes时,procexp执行了如下几个步骤: 1. 获取kernel的映像文件名称     调用IsProcessorFeaturePresent判断PAE是否开启,以确定使用ntoskrn

0xC0000005 2365

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

DLL调试方法

一、DLL调试方法:   (1)、 打开DLL所在的工程,选择run->parameters,在Host Application中选择调用DLL的EXE文件。单击【OK】   (2)、按ctrl+alt+m打开modules,右键Add Module选择EXE调用的DLL所在路径,运行DLL的工程,按ctrl+alt+m,选择DLL,右键单击Reload Symbol Table,在DLL

988

c++ 调试跳出子函数_Python使用pdb更优雅的调试代码

什么是pdb不知道大家在用Python写代码出现报错时是怎样调试的,从报错提示定位回去一步一步check每一行?如果没有IDE或者命令行写代码时又该怎样快速调试?这时如果使用pdb进行调试将会异常方便。Pdb就是Python debugger ,是python自带的调试器。通过 pdb 我们可以交互式的查看运行过程中变量的值、设置断点、逐行执行代码、查看代码的调用栈等等。并且如果环境没有...

weixin_35659005的博客 659

保留PDB,节省调试耗时

转自:http://blog.163.com/hao_dsliu/blog/static/131578908201411314610310/ 我们在解决Bug的时候经常遇到一些难重现的Bug。例如偶尔崩溃的问题,如果错失现场,也许花几天时间也难重现,最后不了了之。在发布后,可能在客户那里重新出现,这种Bug很让人懊恼。 如果我们能掌握一些Release模式下的调试技巧,事情

Adam040606的博客 1490

学习自建调试体系(二)

目录 获取模块信息 NtQuerySystemInformation RtlMoveMemory 枚举符号 SymInitialize SymLoadModule64 SymEnumSymbolsW 回调函数Enum...

weixin_30553837的博客 714
上一篇: 用VC创建不导入任何DLL的WIN32程序
下一篇: Hook Dispatch 实时监控
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值