簡體   English   中英

c - 訪問虛擬內存時出現分段錯誤

[英]c - segmentation fault when accessing virtual memory

我正在嘗試編寫一個程序,該程序采用命令參數required_address打印位於該地址的內存字節(如果存在)。

到目前為止,這是我的代碼:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

/*
  - Takes a single arg: required_address
  - if the address is in virtual memory:
  -   print to stdout the value of the single byte of memory located at address
  -   return with exit code 1
  - else:
  -   print nothing
  -   return with exit code 0

  - 00405000-00426000 [heap]

 */

int main(int argc, char const *argv[]) {
    unsigned long ret_adr = strtoul(argv[1], NULL, 10);
    int pid = getpid();
    FILE *file;
    char c[1000];

    char file_addr[20];
    sprintf(file_addr, "/proc/%d/maps", pid);
    puts(file_addr);

    if ((file = fopen(file_addr,"r")) == NULL){
       printf("Error! opening file\n");

       // Program exits if the file pointer returns NULL.
       exit(1);
    }

    while (fgets(c, sizeof(c), file) != NULL) {
        printf("%s\n", c);
        sleep(1);
    }

    printf("pid: %d\n", pid);

    unsigned long* p = (unsigned long *)ret_adr;
    unsigned long first_byte = p[0];
    printf("%p\n", p);
    return 0;
}

這是我的終端:

[awhite4@fastx07 task1]$ gcc -ggdb -O0 -o task1 task1.c
[awhite4@fastx07 task1]$ setarch x86_64 -R ./task1 400000
/proc/32687/maps
00400000-00401000 r--p 00000000 00:37 3014860647                         /mnt/nfs/clasnetappvm/homedirs/awhite4/Downloads/task1/task1

00401000-00402000 r-xp 00001000 00:37 3014860647                         /mnt/nfs/clasnetappvm/homedirs/awhite4/Downloads/task1/task1

00402000-00403000 r--p 00002000 00:37 3014860647                         /mnt/nfs/clasnetappvm/homedirs/awhite4/Downloads/task1/task1

00403000-00404000 r--p 00002000 00:37 3014860647                         /mnt/nfs/clasnetappvm/homedirs/awhite4/Downloads/task1/task1

00404000-00405000 rw-p 00003000 00:37 3014860647                         /mnt/nfs/clasnetappvm/homedirs/awhite4/Downloads/task1/task1

00405000-00426000 rw-p 00000000 00:00 0                                  [heap]

7ffff7db7000-7ffff7dd9000 r--p 00000000 fd:00 5597327                    /usr/lib64/libc-2.29.so

7ffff7dd9000-7ffff7f26000 r-xp 00022000 fd:00 5597327                    /usr/lib64/libc-2.29.so

7ffff7f26000-7ffff7f72000 r--p 0016f000 fd:00 5597327                    /usr/lib64/libc-2.29.so

7ffff7f72000-7ffff7f73000 ---p 001bb000 fd:00 5597327                    /usr/lib64/libc-2.29.so

7ffff7f73000-7ffff7f77000 r--p 001bb000 fd:00 5597327                    /usr/lib64/libc-2.29.so

7ffff7f77000-7ffff7f79000 rw-p 001bf000 fd:00 5597327                    /usr/lib64/libc-2.29.so

7ffff7f79000-7ffff7f7f000 rw-p 00000000 00:00 0 

7ffff7fce000-7ffff7fd1000 r--p 00000000 00:00 0                          [vvar]

7ffff7fd1000-7ffff7fd2000 r-xp 00000000 00:00 0                          [vdso]

7ffff7fd2000-7ffff7fd3000 r--p 00000000 fd:00 5515071                    /usr/lib64/ld-2.29.so

7ffff7fd3000-7ffff7ff3000 r-xp 00001000 fd:00 5515071                    /usr/lib64/ld-2.29.so

7ffff7ff3000-7ffff7ffb000 r--p 00021000 fd:00 5515071                    /usr/lib64/ld-2.29.so

7ffff7ffc000-7ffff7ffd000 r--p 00029000 fd:00 5515071                    /usr/lib64/ld-2.29.so

7ffff7ffd000-7ffff7ffe000 rw-p 0002a000 fd:00 5515071                    /usr/lib64/ld-2.29.so

7ffff7ffe000-7ffff7fff000 rw-p 00000000 00:00 0 

7ffffffdd000-7ffffffff000 rw-p 00000000 00:00 0                          [stack]

ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

pid: 32687
Segmentation fault (core dumped)

如何使用 400000 地址訪問存儲在該地址的值? 我嘗試使用指針並獲取地址,但是當我嘗試獲取該值時,出現Segmentation fault錯誤。

我如何直接訪問內存,因為我知道它是有效的(它在 /proc//maps 中顯示的堆中)?

我只是不了解訪問此內存的正確方法嗎?

/proc/.../maps中顯示的地址以十六進制顯示,即基數為 16。

您正在讀取 base 10 ( 0x61a80 ) 中的400000地址,這意味着您正在嘗試訪問0x400000以下的未映射內存,這是第一個映射的開始。

檢查您的strtoul()參數!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM