当我想获取初始化堆栈信息时的核心转储

Core dump when I want to get the init stack infomation

我写了一个小测试来尝试打印程序的初始化堆栈,这是代码

#include <stdio.h>
#include <elf.h>

int main(int argc, char* argv[])
{
    int *p = (int*)argv;
    int i;
    Elf32_auxv_t* aux;
    printf("Argument count: %d\n", *(p - 1));
    
    for (int i = 0; i < *(p - 1); ++i)
    {
        printf("Argument %d : %s\n", i, *(p + i));
    }
    
    p+=i;    
    p++;
    printf("Enviroment\n");
    
    while (*p)
    {
        printf("%s\n", *p);
        p++;
    }
    
    p++;
    
    printf("Auxiliary Vector\n");
    aux = (Elf32_auxv_t*)p;
    while (aux->a_type != AT_NULL)
    {
        printf("Type: %02d Value: %x\n", aux->a_type, aux->a_un.a_val);
        aux++;
    }
    
    return 0;

}

我想看到的是打印环境指针和AT_PHDR、AT_PHENT、AT_PHNUM、AT_ENTRY和AT_NULL。但是结果显示这里是核心转储

Argument count: 0
Enviroment
Segmentation fault (core dumped)

程序有什么问题?感谢您的帮助。

这是我的最高评论。

Thanks for your reply. So this program may only work in 32bit system.

可以[有点]使用(例如):

void *vp = &argc;

不是 64 位的真实框架。编译器会将 argc 存储到 main 堆栈帧中的虚拟区域并指向该区域。它与 32 位类似但不完全相同。

但是...你的指针算法有点脆弱(例如):

printf("Argument count: %d\n", *(p - 1));

效果不太好。

这是我编写的一些代码,[本质上] 完成您正在做的事情,但以一种干净(呃)的方式:

#include <stdio.h>

int glob_argc;
char **glob_argv;
char **glob_envp;
void *glob_frame;

void
showframe(void)
{
    char **vp = glob_frame;

    for (int idx = 0;  idx < 32;  ++idx, ++vp)
        printf("%d: %p %p\n",idx,vp,*vp);
}

int
main(int argc,char **argv,char **envp)
{

    glob_argc = argc;
    glob_argv = argv;
    glob_envp = envp;

    glob_frame = __builtin_frame_address(0);
    printf("glob_frame=%p\n",glob_frame);

    printf("glob_argc=%d\n",glob_argc);
    printf("glob_argv=%p\n",glob_argv);
    printf("glob_envp=%p\n",glob_envp);
    showframe();

    return 0;
}