当前位置:   article > 正文

Linux下定位内存踩踏问题的一种方法

Linux下定位内存踩踏问题的一种方法

Linux下定位内存踩踏问题的一种方法


我们在Linux下用C/C++开发具有一定复杂性的系统时,需要集成多个部门开发的SDK。内存越界的问题,往往让人头疼。本文提供了一种思路,用来定位内存踩踏。

  • 开发者应该清楚哪块内存不应该被写入(或padding一块只读区域)
  • 使用munlock函数对该区域加锁
  • 该区域一旦被写入,就会触发段错误,通过调用栈即可定位

演示代码(main.cpp)

#include <thread>
#include <stdio.h>
#include <sys/mman.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <cerrno>
#include <cstring>
#include <iostream>
#include <assert.h>

void run(char *ptr)
{
    ptr[100]=100; //非法写入
    printf("success\n");
}
int main()
{
    int page_count=64;
    const int page_size = sysconf(_SC_PAGE_SIZE); //
    int mem_size=page_size*page_count;
    char * sys_config=(char*)aligned_alloc(page_size,mem_size);
    int ret=mprotect(sys_config,mem_size, PROT_READ);//需要页对齐
    assert(ret==0);
    auto t=new std::thread(run,sys_config); //在别的线程中操作该内存
    t->join();
    delete t;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

编译并执行

g++ -ggdb -o demo main.cpp  -lpthread
ulimit  -c unlimited
./demo
gdb ./demo  core
(gdb) bt
#0  run (ptr=0x7cd0e21b3000 "") at main.cpp:14
(gdb) quit
vim main.cpp +14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

输出

12 void run(char *ptr)
13 {
14     ptr[100]=100; //非法写入
15     printf("success\n");
16 }
  • 1
  • 2
  • 3
  • 4
  • 5
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/146537
推荐阅读
相关标签
  

闽ICP备14008679号