- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个问题。我正在从事一个预期存在段错误的项目,我必须使用 setjmp 和 ljmp 机制捕获段错误并更改默认行为(即应用程序崩溃)。当代码抛出段错误时,内存分配已经完成。有什么办法可以解除调用 setjmp 后完成的内存分配吗?简单的话:我想解除对 setjmp 的初始调用和从 ljmp 调用的内存分配之间的分配。这是一个小而有效的代码,我们可以讨论...
谢谢
#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;
}
最佳答案
实际上并没有办法用普通的 malloc
来做到这一点。没有可移植工具可以让您跟踪自某个时间点以来已完成的分配。
你可以做的是这样的:创建一个包装 malloc
的函数,并将每个新分配的内存区域添加到一个链表中。当您需要清除内存泄漏时,遍历此列表并释放
您在那里找到的所有 block 。当然,这只有在您可以保证没有指针指向已分配区域的情况下才有效。
重新设计您的控制流可能是个好主意,这样在您想要中止控制期间不会发生内存分配。
关于c - ljmp 和 setjmp 之间的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28739836/
有没有办法使用 setjmp 来实现多任务处理?和 longjmp职能 最佳答案 这是所谓的用户空间上下文切换的一种形式。 这是可能的,但很容易出错,特别是如果您使用 setjmp 和 longjmp
我想在 Linux 环境中实现 POSIX 兼容的微线程。基本思路如下: 使用描述的技术 here , 为每个纤程分配新的栈空间。 使用 setitimer,创建将以固定时间间隔发送信号的计时器。此计
ISO/IEC 9899:1999 7.13.1.1 The setjmp macro Environmental limits 4 An invocation of the setjmp macro
我一直在尝试追踪我的代码(使用 setjmp)中的间歇性崩溃错误,并将其缩小为:在使用/O2 编译时显示,使用/O2/Oy- 消失,即仅显示省略帧指针。 http://msdn.microsoft.c
通常 setjmp 和 longjmp 不关心调用栈——函数只是保存和恢复寄存器。 我想使用 setjmp 和 longjmp 以便保留调用堆栈,然后在不同的执行上下文中恢复 EnableFeatur
下面的代码无法正常工作。谁能指出原因 #define STACK_SIZE 1524 static void mt_allocate_stack(struct thread_struct *mythr
一段代码在这里 jmp_buf mark; int Sub_Func() { int be_modify, jmpret; be_modify = 0; jmp
我的问题针对的是 setjmp/longjmp 关于局部变量的行为。 示例代码: jmp_buf env; void abc() { int error; ... if(error)
我正在尝试为 C OSX Carbon 多线程 应用程序安装“崩溃处理程序”。在 Windows 上,我可以轻松使用简单高效的 __try{} __except{} SEH of Windows效果很
我必须使用 setjmp/longjmp 实现用户级线程库作为作业。这是我写的代码: #include #include #include #include #include #includ
这个问题来自 SetJmp/LongJmp: Why is this throwing a segfault? 当我使用 Debug模式运行代码时,它确实按预期崩溃了。但是如果我使用 release
我不明白为什么在函数 middleFunc() 中,当 entry_point(arg) 在 if ( setjmp(中间) ) 语句。 #include #include
为什么 setjmp 不保存堆栈? 考虑以下代码: #include jmp_buf Buf; jmp_buf Buf2; void MyFunction() { for(int i = 0
#include #include #include #include static jmp_buf env_alrm; static void sig_alarm(int signo) {
在不久前的blog post中,Scott Vokes使用C函数setjmp和longjmp描述了与lua实现协程相关的技术问题: The main limitation of Lua corouti
在jpeglib ,必须使用 setjmp/longjmp 来实现自定义错误处理。 有很多资源说 setjmp/longjmp 不能很好地与 c++ 配合使用(例如 this question 中的答
我的问题针对的是 setjmp/longjmp 关于局部变量的行为。 示例代码: jmp_buf env; void abc() { int error; ... if(error)
我试图理解以下代码中的 setjmp: http://androidxref.com/4.2.2_r1/xref/frameworks/base/core/jni/android/graphics/Y
我正在调查setjmp/longjmp,发现setjmp 保存指令指针、堆栈指针等寄存器... 然而,我在这里没有得到的是,在调用 setjmp 和 longjmp 之间,不能修改线程本身堆栈中的数据
在 Why volatile works for setjmp/longjmp , 用户 greggo评论: Actually modern C compilers do need to know t
我是一名优秀的程序员,十分优秀!