首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ljmp和setjmp之间的内存泄漏

ljmp和setjmp之间的内存泄漏
EN

Stack Overflow用户
提问于 2015-02-26 10:23:23
回答 1查看 183关注 0票数 1

我有个问题。我正在进行一个项目,在该项目中存在预期的分段错误,我必须捕获分段错误并使用setjmp和ljmp机制更改默认行为(即应用程序崩溃)。当代码抛出分段错误时,内存分配已经完成。有什么方法可以在调用setjmp之后释放内存分配吗?简单的话:我希望在初始调用setjmp和从ljmp调用的调用之间释放内存分配。这是一个很小但很有用的代码,我们可以讨论.

谢谢

代码语言:javascript
复制
#include <stdio.h>
#include <setjmp.h>
#include <signal.h>
#include <stdlib.h>

static jmp_buf buf;



static void 
addSignalToMask()
{
  sigset_t sigset;
  if ( 0 > sigprocmask(0,NULL,&sigset)){
    fprintf(stderr," error while retreiving procmask \n");
    exit(1);
  }

  if ( -1 == sigaddset(&sigset,SIGSEGV) ){
    /* on error errno is set */
    perror(" SIGSEGV cannot be added to signal set \n ");
    exit(1);
  }

  if ( 0 > sigprocmask(SIG_UNBLOCK,&sigset,NULL)){
    fprintf(stderr," error while retreiving procmask \n");
    exit(1);
  }

  fprintf(stdout, " SIG_SEGV added to signal set \n");

  return;
}

static void 
signalHandler(int arg)
{
  fprintf(stdout ," I am in signal handler \n");
  longjmp(buf,1);             // jumps back to where setjmp was called - making setjmp now return 1
}


static void
throwSegmentation()
{
  int * ptr = 0x0;

  /* a leak of 10x4 = 40 bytes */
  void * leak = malloc(sizeof(int) * 10);

  /* now attempting to write on address 0x0 */
  *ptr = 0xdeadbeef;
}

static void
setUpAndThrowSeg()
{
 if ( 0 == setjmp(buf) ) {
    fprintf(stdout," jump set \n");
    throwSegmentation();
 }else {                    
    /* remove blocked SIGSEGV from procmask */
    fprintf(stdout," returned from segmentation\n");
    addSignalToMask();
 }
}

int main() {
  int count = 10;
  if (SIG_ERR == signal(SIGSEGV, signalHandler)){
    fprintf(stderr," signal handler not set up \n");
    exit(1);
  }

  while ( 0 != count --) {
    fprintf(stdout, " throwing again \n");
    setUpAndThrowSeg();
  }

  return 0;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-26 11:43:02

对于股票malloc,没有一种真正的方法可以做到这一点。没有便携工具可以让您跟踪自某一时间点以来所做的分配。

您可以这样做:创建一个包装malloc并将每个新分配的内存区域添加到链接列表中的函数。当您需要清除内存泄漏时,遍历这个列表,并free您在那里找到的所有块。当然,只有当您能够保证没有指向分配区域的指针仍然存在时,这才有效。

重新工作您的控制流可能是个好主意,这样在您想要中止控件的时间内就不会发生内存分配。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28739836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档