【问题标题】:Getting module name and process name in LINUX C++在 LINUX C++ 中获取模块名称和进程名称
【发布时间】:2020-10-24 20:51:03
【问题描述】:

我有一个共享库,其中包含我想移植到 linux 的 2 种方法(当然还有其他方法):

GetProcessName() - 应该获取可执行文件的名称或路径(两者都可以)
GetModuleName() - 应该返回运行代码的模块的名称(dll 或 exe)。

在 Windows 环境中,我使用 GetModuleFileName 两种方法的不同变体。

我已经看到了很多获取进程名称的解决方案,但其中大多数似乎有点不合时宜。
而且我还没有找到获取模块名称的解决方案。

linux中是否有类似的功能?
我该如何实现它们?

【问题讨论】:

  • 进程有this。我认为没有与正在运行的库等效的库,或者至少没有一个不会严重“hacky”的库。
  • 我想如果这是唯一的方法,我可以为正在运行的模块/库使用“hacky”解决方案,但我还没有找到任何解决方案。
  • @MSalters:副本不是比这个问题更具体吗?虽然该问题的答案(如何获取可执行文件/库文件的路径)无疑是该问题解决方案的一部分,但另一个问题及其答案并未解决如何获取库路径的问题当前正在执行。该问题的答案是否与重复的问题相关?
  • @user2079303:它确实不太具体:它可以获取任何库,而不仅仅是当前正在执行的库。您只需要一个地址,即当前 IP。
  • @MSalters:获取当前 IP 的最简单、非编译器/架构特定方法(只要它适用于 linux)是什么?这对我来说似乎并不简单,我无法使用搜索功能找到这样的问题。我应该为此创建一个新问题吗?

标签: c++ linux process module


【解决方案1】:

由于有些混乱,这里有两个步骤来获取当前函数的“模块”数据。

  1. 通过 IP 寄存器或调用仅返回 __builtin_return_address(0) 的小函数获取当前函数。还有一种方法是将&foo 放入foo()
  2. 调用dladdr,传递当前函数的地址。

【讨论】:

    猜你喜欢
    • 2013-11-06
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多