获取进程段的开始和结束 C/C++

2024-04-22

我需要获取以下进程段的开始和结束地址:代码、数据、堆栈、环境。我了解它如何位于内存中,但不知道如何使用 api 调用或其他方式获取它。我找到了如何使用此代码开始某些片段

#include <stdio.h>

int temp_data = 100;
static int temp_bss;

void print_addr ( void )
{
        int local_var = 100;
        int *code_segment_address = ( int* ) &print_addr;
        int *data_segment_address = &temp_data;
        int *bss_address = &temp_bss;
        int *stack_segment_address = &local_var;

        printf ( "\nAddress of various segments:" );
        printf ( "\n\tCode Segment : %p" , code_segment_address );
        printf ( "\n\tData Segment : %p" , data_segment_address );
        printf ( "\n\tBSS : %p" , bss_address );
        printf ( "\n\tStack Segment : %p\n" , stack_segment_address );

}

int main ( )
{
        print_addr ();
        return 0;
}

但我不知道如何找到每个段的结尾。我唯一的想法是一个片段的结束是另一个片段的开始。 请解释我如何使用 C 和 linux API 来做到这一点。


我不确定数据或堆段是否定义良好且唯一(特别是在多线程应用程序中,或者只是在使用动态库的应用程序中,包括libc.so)。换句话说,不再有任何明确定义的文本、数据或堆段的开始和结束,因为今天的进程有许多这样的段。所以你的问题在一般情况下甚至没有意义。

Most malloc实现使用mmap(2) http://man7.org/linux/man-pages/man2/mmap.2.html and munmap比...多得多sbrk

你应该阅读更多关于proc(5) http://man7.org/linux/man-pages/man5/proc.5.html。特别是,您的应用程序可以读取/proc/self/maps (or /proc/1234/maps对于 pid 1234 的进程)或/proc/self/smaps; try cat /proc/self/maps并考虑使用fopen(3) http://man7.org/linux/man-pages/man3/fopen.3.html on "/proc/self/maps"(然后循环fgets or readline,最后很快fclose)。也许dladdr(3) http://man7.org/linux/man-pages/man3/dladdr.3.html可能相关。

您还可以阅读ELF https://en.wikipedia.org/wiki/Executable_and_Linkable_Format程序的标题,例如的/proc/self/exe。也可以看看雷德尔夫(1) http://man7.org/linux/man-pages/man1/readelf.1.html and 对象转储(1) http://man7.org/linux/man-pages/man1/objdump.1.html & 执行(2) http://man7.org/linux/man-pages/man2/execve.2.html & elf(5) http://man7.org/linux/man-pages/man5/elf.5.html & ld.so(8) http://man7.org/linux/man-pages/man8/ld.so.8.html & libelf http://www.mr511.de/software/english.html。另请阅读莱文的链接器和加载器 http://www.iecc.com/linker书和德雷珀的论文:如何编写共享库 http://people.redhat.com/drepper/dsohowto.pdf.

也可以看看这个答案 https://stackoverflow.com/a/26436766/841108到一个相关的问题(以及那个问题 https://stackoverflow.com/q/26437921/841108)。请注意,最近的 Linux 系统有ASLR https://en.wikipedia.org/wiki/Address_space_layout_randomization,因此在同一环境中运行同一程序的两个相似进程的地址布局会有所不同。

也尝试跟踪(1) http://man7.org/linux/man-pages/man1/strace.1.html一些简单的命令或您的程序。你会更了解一些相关的内容系统调用(2) http://man7.org/linux/man-pages/man2/syscalls.2.html。另请阅读高级Linux编程 http://advancedlinuxprogramming.com/

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

获取进程段的开始和结束 C/C++ 的相关文章

  • 浮点等于的意外结果

    问题不在于为什么0 1 0 9不等于1 0 这是关于平等者的不同行为 有人可以解释为什么下面的示例的工作方式不同 float q 0 1f float w 0 9f float summ q w q w 1 0f False summ 1
  • 为什么调用 istream::tellg() 会影响我的程序的行为?

    我正在尝试将 24 位位图图像转换为灰度图像 include
  • C中的内存使用问题

    请帮忙 操作系统 Linux 其中 sleep 1000 中 此时 top 显示Linux任务 给我写了7 7 MEM使用 valgrind 未发现内存泄漏 我明白 写得正确 所有 malloc 结果都是 NULL 但是为什么这次 睡眠 我
  • 在 C# 中将“set”添加到接口的属性中

    我希望通过为该接口中的属性提供设置访问器来 扩展 该接口 界面看起来像这样 interface IUser string UserName get 我想要这样的东西 interface IMutableUser IUser string U
  • 删除 QComboBox“下拉”动画

    我正在使用 Qt 4 8 并且想在单击 QComboBox 时摆脱 下拉 动画 我也想稍微移动一下 到目前为止 我一直在考虑重新实现 showPopup 和 hidePopup 但不知道如何使其工作 此外 每次我尝试使用 CSS 进行移动或
  • 如何检查特定作业是否在quartz调度程序中运行#

    我正在使用石英调度程序根据触发器的用户输入来安排写入文件的作业 我想检查作业是否仍在 stop 方法中运行 如何检查作业是否仍在运行 public class JobScheduler static StdSchedulerFactory
  • 如何在 TargetFrameworks 标记中每个框架运行一次的目标之前创建仅运行一次而不是一次的 MSBuild 目标?

    我有一个我部分拥有的代码生成器工具 现在 csproj 文件可以在其中列出多个目标框架并构建所有这些框架 我试图弄清楚如何使 MSBuild 目标仅在每个目标中生成一次代码无论列出了多少个目标框架 都将运行构建 并让每个目标框架的编译等待代
  • web请求超时处理?

    HttpWebRequest request HttpWebRequest WebRequest Create url request Timeout 20000 using WebResponse response request Get
  • 如何使用 Moq 模拟 Web 服务调用?

    The using下面点击了我不想实际点击的外部资源 我想测试someResult以及使用它的代码 但每次我运行单元测试时 该代码仍然尝试访问真正的 Web 服务 如何使用最小起订量来伪造对 Web 服务的真实调用 但不模拟使用中的其余代码
  • Windows 10 ScrollIntoView() 不会滚动到列表视图中间的项目

    我有一个包含 20 个项目的列表视图 我想以编程方式滚动列表视图 ListView ScrollIntoView ListView Items 0 将滚动列表视图到第一项 ListView ScrollIntoView ListView I
  • winapi 函数的函数指针 (stdcall/cdecl)

    请有人给我一些为 MS winapi 函数创建函数指针的提示吗 我试图为 DefWindowProc DefWindowProcA DefWindowProcW 创建一个指针 但出现此错误 LRESULT dwp HWND UINT WPA
  • 将数据表传递给存储过程

    我有一个用 C 创建的数据表 using DataTable dt new DataTable dt Columns Add MetricId typeof int dt Columns Add Descr typeof string dt
  • 如何使用SQL Server CE的动态连接字符串?

    我在 Windows 应用程序中使用 SQL Server CE 4 0 并使用实体框架创建它的模型 它工作正常 但我的问题是它没有构造函数来更改连接字符串 并且默认情况下它从app config file using var Contex
  • Qt 信号槽,新符号中的转换类型[重复]

    这个问题在这里已经有答案了 鉴于以下两个 connect ui gt comboBox SIGNAL activated QString ps SLOT requestPlotsAvailable QString connect ui gt
  • 从 Java 读取 /dev/input/js0

    我正在尝试阅读 dev input js0来自Java 但我不断得到 java io IOException Invalid argument at java io FileInputStream read0 Native Method a
  • 如何使用 html 敏捷包获取自定义标签?

    需要创建摘要 索引 为此我有标签
  • 将 JSON 转换为数据表

    我有以下格式的 JSON id 10 name User add false edit true authorize true view true id 11 name Group add true edit false authorize
  • 从 C++ 检索 Python 类型

    这个问题实际上是以下两个问题的延伸 如何在 Python 中实现 C 类 以供 C 调用 https stackoverflow com questions 9040669 how can i implement a c class in
  • C 中的静态和外部内联函数[重复]

    这个问题在这里已经有答案了 我正在尝试详细了解静态函数和外部函数之间的区别 我知道静态内联函数和外部内联函数之间的基本区别 我的理解如有错误请指正 静态内联函数仅对定义它的翻译单元可见 外部内联函数可以在多个翻译单元中访问 最好在头文件中定
  • 在 C# 中调用并排显示窗口

    愚蠢的问题是否有一种简单的方法可以清除桌面 然后打开两个资源管理器窗口并调用 并排显示窗口 任务栏调用 只是想知道 MS 库中是否有 api 可以做到这一点 您可以使用TileWindowsWinAPI 函数通过 p invoke 将所需窗

随机推荐