C 中运行时的变量名、函数参数

2023-11-23

C 程序运行时是否可以知道函数参数和变量的名称类型?例如,如果我有一个函数:

int abc(int x, float y , somestruct z ){
    char a;
    int b ;
}

我可以知道这个函数的内部吗abc(),参数和变量的名称是什么i.e.在这种情况下它的x, y, z, a, b它们属于类型int, float, somestruct, char, int.

假设还有另一个函数:

float some_func(specialstruct my_struct, int index){

} 

我应该知道参数名称是my_struct, index和类型是specialstruct, int.

我在运行时需要这些信息吗?

我可以访问基指针和返回地址,我可以使用上面的指针获取所需的信息吗?

我能够使用返回地址提取函数名称并dladdr()功能。

I see GDB是这样,所以应该可以提取这些信息吗?


正如其他人指出的,反射并未内置于 C 或 C++ 语言中。有各种各样的想法here

但是,在 C/C++ 中,可以使用第 3 方库和可执行文件或外部文件中的调试符号进行反射。

The dwarfdump可执行文件或多或少可以满足您的期望。通过 DWARF 信息,可以获得有关函数、变量、类型等的详细信息。以类似的方式,进程可以使用 libdwarfdump 功能来检查自身。

这是一个简单的手动示例:

typedef struct somestruct 
{
   int i;
   int j;
} somestruct ;

int abc(int x, float y , struct somestruct z ){
    char a;
    int b ;
}


int main(int argc, char* argv[])
{

   struct somestruct z;
   abc(1,1.0f,z);
   return 0;
}

以及 dwarfdump 的部分输出

< 1><0x00000055>    DW_TAG_subprogram
                      DW_AT_external              yes(1)
                      DW_AT_name                  "abc"
                      DW_AT_decl_file             0x00000001 /tmp/dwarf.c
                      DW_AT_decl_line             0x00000009
                      DW_AT_prototyped            yes(1)
                      DW_AT_type                  <0x0000004e>
                      DW_AT_low_pc                0x004004ed
                      DW_AT_high_pc               <offset-from-lowpc>18
                      DW_AT_frame_base            len 0x0001: 9c: DW_OP_call_frame_cfa
                      DW_AT_GNU_all_call_sites    yes(1)
                      DW_AT_sibling               <0x000000ad>
< 2><0x00000076>      DW_TAG_formal_parameter
                        DW_AT_name                  "x"
                        DW_AT_decl_file             0x00000001 /tmp/dwarf.c
                        DW_AT_decl_line             0x00000009
                        DW_AT_type                  <0x0000004e>
                        DW_AT_location              len 0x0002: 916c: DW_OP_fbreg -20
< 2><0x00000082>      DW_TAG_formal_parameter
                        DW_AT_name                  "y"
                        DW_AT_decl_file             0x00000001 /tmp/dwarf.c
                        DW_AT_decl_line             0x00000009
                        DW_AT_type                  <0x000000ad>
                        DW_AT_location              len 0x0002: 9168: DW_OP_fbreg -24
< 2><0x0000008e>      DW_TAG_formal_parameter
                        DW_AT_name                  "z"
                        DW_AT_decl_file             0x00000001 /tmp/dwarf.c
                        DW_AT_decl_line             0x00000009
                        DW_AT_type                  <0x0000002d>
                        DW_AT_location              len 0x0002: 9160:        DW_OP_fbreg -32

通过仔细研究,我们可以看到该片段定义了带有参数 x、y 和 z 的函数“abc”。

参数 x 的类型是对键为 0x4e 的类型表的间接寻址。

查看输出中的其他位置,我们可以看到类型 0x4e 的定义。类型 0x2d 是与参数 z 相关联的某个结构。

< 1><0x0000002d>    DW_TAG_structure_type
                      DW_AT_name                  "somestruct"
                      DW_AT_byte_size             0x00000008
                      DW_AT_decl_file             0x00000001 /tmp/dwarf.c
                      DW_AT_decl_line             0x00000003
                      DW_AT_sibling               <0x0000004e>

< 1><0x0000004e>    DW_TAG_base_type
                      DW_AT_byte_size             0x00000004
                      DW_AT_encoding              DW_ATE_signed
                      DW_AT_name                  "int"

ptrace、ELF、DWARF 和 /proc 文件系统的组合允许 gdb 读取进程的静态和动态信息。另一个进程可以使用类似的功能来创建反射功能。

我已经使用此策略的变体来创建自定义调试器和内存泄漏检测器。然而,我从未见过这种策略用于业务逻辑。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 中运行时的变量名、函数参数 的相关文章

  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • SSH,运行进程然后忽略输出

    我有一个命令可以使用 SSH 并在 SSH 后运行脚本 该脚本运行一个二进制文件 脚本完成后 我可以输入任意键 本地终端将恢复到正常状态 但是 由于该进程仍在我通过 SSH 连接的计算机中运行 因此任何时候它都会登录到stdout我在本地终
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • 在redshift中使用sql函数generate_series()

    我想在redshift中使用生成系列功能 但没有成功 redshift 文档说不支持 下面的代码确实有效 select from generate series 1 10 1 outputs 1 2 3 10 我想对日期做同样的事情 我尝试
  • 如何在Google Map sdk iOS中绘制从一个地方到另一个地方的路径?

    我需要在谷歌地图中找到从一个地方到另一个地方的路径 如何使用 google 地图 sdk iOS 绘制方向图 任何人都可以给出源代码 然后解释如何实现这一目标 Below i attached image also i need to ac
  • scala 中的泛型不变协变逆变

    这可能是一个非常愚蠢的问题 但即使在挠了很长时间之后我也无法理解其中的区别 我正在浏览 scala 泛型页面 https docs scala lang org tour generic classes html 这里据说 注意 泛型类型的
  • 如何使用类型特征进行条件编译?

    我正在尝试编写类似的代码here但使用 C 11 功能 不使用 Boost 工作自这个例子 我试图定义一个response trait 以及基于特征结果的条件编译 我怎样才能做到这一点 include
  • 从 XML 文档中获取指定的 Node 值

    我在浏览 XML 文档 使用 C 并获取所有必要的值时遇到问题 我成功地遍历了 XML 文档中所有指定的 XmlNodeList 成功获取了其中的所有 XmlNode 值 但我必须获取此 XmlNodeList 之外的一些值 例如
  • Webpack 和 angularJs

    我正在尝试使用 angularjs 和 webpack 运行简单的应用程序 这是我的代码 索引 html Full Name firstName lastName app js var app angular module myApp
  • 如何在 OAML 中读取位图?

    我想使用 OCAML 读取位图文件 从文件系统 并将像素 颜色 存储在具有位图维度的数组中 每个像素将占用数组中的一个单元格 我找到了这个功能Graphics dump image 图像 gt 颜色数组 数组但它不从文件中读取 影像影像应该
  • Python 正则表达式 \w 与组合变音符号不匹配?

    我有一个带有组合变音符号的 UTF8 字符串 我想将它与 w正则表达式序列 它匹配带有重音符号的字符 但如果存在带有组合变音符号的拉丁字符则不匹配 gt gt gt re match a w w wz u aoooz re UNICODE
  • jsonschema2pojo 不从 json 字符串生成 pojo 类

    我正在关注链接从 JSON 生成 Java 类 从 json 字符串 而不是从模式 创建 POJO 类 我正在使用 0 4 10 版本的 jsonschema2pojo jar 但无法生成 POJO 类 我的代码如下 public clas
  • 通过 RESTeasy 上的名称绑定将过滤器与特定方法匹配

    我正在尝试指定一个仅与我的某些 API 调用关联的预匹配过滤器 方法如下 RESTeasy 文档建议 我的代码如下所示 姓名绑定 NameBinding public interface ValidateFoo 资源 Path foo ba
  • NGINX 反向代理和访问控制允许来源问题

    我正在配置一个NGINX Reverse Proxy 在浏览器上我转到 客户端网址 https www hollywood com 那么上面的网页需要执行以下请求 服务器网址 https server hollywood com api a
  • sudoers NOPASSWD: sudo: 不存在 tty 且未指定 Askpass 程序

    我添加了一个这样的用户 adduser system home no home no create home group disabled password disabled login testuser 将用户添加到组中 adduser
  • scrapy中提取类名

    我正在尝试取消 trustpilot com 的评级 是否可以使用scrapy提取类名 我正在尝试抓取由五个单独图像组成的评级 但这些图像位于具有评级名称的类中 例如 如果评级为 2 则开始 div class star rating co
  • php:会话与数据库

    我有一个类从数据库中检索其成员 或多或少 10 个成员 我的问题是 每次从数据库 MySQL 获取它们 只在会话数组中留下一个ID 还是直接将它们存储在会话数组中 是否更有效 而且性能方面的差异这么大吗 假设数据库有 100 000 行 考
  • 将 R 诊断消息发送到 stdout 而不是 stderr

    寻找一个选项可以让我重定向 R 诊断消息 由message to stdout not stderr因为它是默认的 message手册指出 默认处理程序将消息发送到 stderr 连接 那么问题是如何改变这种默认行为 仍然保留重定向warn
  • 从 json 文件中读取多个元素

    我有一个 json 文件 其中包含许多如下元素 code hfuiew89 type location coordinates lat 40 9861 lon 29 1046 index 1 lat 40 9976 lon 29 1153
  • GO111MODULE=on(加载模块要求时出错)

    go get u github com junegunn fzf工作正常 但想像这样测试开发分支 gert gert GO111MODULE on go get u github com junegunn fzf devel go find
  • 具有多个数据源的工作单元?

    有可能 甚至很可能 我只是没有完全理解 工作单元 的概念 基本上 我将其视为面向对象环境中使用的广泛事务 启动工作单元 与对象交互 提交或回滚 但这如何分解为这些对象背后的数据存储上的实际事务呢 在具有单个 DB 和 ORM 例如 NHib
  • 在启动 Shiny 应用程序时更改 RStudio 窗口的大小

    我正在使用 RStudio IDE 来开发闪亮的应用程序 启动应用程序时 我通常使用 RunApp 按钮 在窗口中运行 这将在具有特定宽度和高度的窗口中打开应用程序 有没有办法更改此窗口的宽度 以便每次启动应用程序时都会显示在更宽的窗口中
  • C 中运行时的变量名、函数参数

    C 程序运行时是否可以知道函数参数和变量的名称类型 例如 如果我有一个函数 int abc int x float y somestruct z char a int b 我可以知道这个函数的内部吗abc 参数和变量的名称是什么i e 在这