问题标签 [setjmp]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
567 浏览

c++ - 此代码是否包含隐藏的错误?

以下代码:

  • 使用 gcc 版本 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5/32bits) 编译时运行良好
  • 使用 MSVC10 (Win7/32bits) 编译时运行良好
  • 使用 gcc 版本 4.5.2 运行时崩溃(Win7/32 位上的 MinGW)

主.cpp

我尝试调试它,但程序的行为很奇怪。有时我可以通过第一个断点 (BP1),然后在 BP2 处崩溃,有时控制永远不会到达 BP1,就像程序陷入无限循环一样。我不能用我的调试技能说更多。

这段代码是我能得到的最少的代码,它展示了 MinGW 4.5 的奇怪行为。我还注意到:

  • 如果我用do_work它的内容替换函数调用,程序运行良好。
  • 如果我删除try{ ... } catch(...){ }里面的块do_work,程序运行正常。
  • 优化标志无效(总是崩溃)。

我知道setjmp/longjmpC++ 代码中的问题,但我不得不使用它来与一些遗留 C 代码交互。

我的问题 :

  • 这是错误/错误/错误的代码吗?还是 MinGW 4.5 对代码处理不当?(责备该工具是苛刻和冒昧的,但我怀疑其中的一些设置)。

感谢您的任何建议。

如有必要,请重新标记。

0 投票
4 回答
9514 浏览

c - 关于 setjmp/longjmp

我正在调查setjmp/longjmp并发现setjmp保存了诸如指令指针、堆栈指针等寄存器...

但是我在这里没有得到的是,线程本身的堆栈中的数据不能在调用setjmplongjmp之间进行修改。在那种情况下,longjmp不会按预期工作。

为了清楚起见,例如,当longjmp恢复堆栈指针时,假设堆栈指针现在指向的内存中的数据与调用setjmp时的数据不同。这会发生吗?如果发生这种情况,我们不是有麻烦吗?

还有这句话的意思是,“在调用 setjmp() 例程的例程返回之后,可能不会调用 longjmp() 例程。

0 投票
1 回答
703 浏览

c - 将 fork 与 setjmp/longjmp 一起使用

我试图使用 fork 结合setjmp/longjmp来实现基于多线程 fork 的检查点方案。我希望我的解决方案能奏效,但正如预期的那样,它没有。代码如下所示,其中包含检查点/回滚的示例用法。

主要思想是自己为线程分配堆栈,就像使用函数pthread_create_with_stack一样,然后只使用来自主线程的 fork。分支进程(检查点)在开始时被挂起,当被唤醒(回滚)时,分支进程的主线程通过调用pthread_create重新创建线程,并使用与原始进程中的线程相同的堆栈。longjmp也是在线程例程开始时完成的,以便在进程作为检查点分叉时跳转到代码中的同一点。请注意,所有setjmp调用都在函数my_pthread_barrier_wait内完成,因此没有线程获得锁。

我认为这里的问题是setjmp/lonjmp。getcontext /savecontext/makecontext会在这里提供帮助,还是其他什么?甚至可以在这里以这样的方式使用setjmp/longjmp吗?任何解决方案将不胜感激。

0 投票
3 回答
4492 浏览

c - 为什么 volatile 适用于 setjmp/longjmp

调用 longjmp() 后,如果非 volatile 限定的本地对象的值在调用 setjmp() 后可能已更改,则不应访问它们。在这种情况下,它们的值被认为是不确定的,访问它们是未定义的行为。

现在我的问题是为什么 volatile 在这种情况下有效?那个 volatile 变量的变化不会仍然使 longjmp 失败吗?例如,在下面给出的示例中,longjmp 将如何正常工作?当代码在 longjmp 之后返回到 setjmp 时,local_var 的值不会是 2 而不是 1 吗?

0 投票
2 回答
1324 浏览

c - 对 setjmp/longjmp 使用 volatile 的性能开销

要使setjmp/longjmp工作,您需要将局部变量声明为 volatile。如果有人使用 -O3 编译其代码,那么 volatile 变量对性能的影响有多大。在 x86 多核平台上它会很大还是只有一点点?

在我看来,它只会增加一点点开销,因为该 volatile 变量仍然可以被缓存,并且从缓存中读取/写入无论如何都非常快。意见?

0 投票
1 回答
399 浏览

c - GDB 在 Eclipse 中的 longjmp 上崩溃

我在eclipse中使用c来编写程序。我需要使用GDB逐步调试它。但是在 longjmp 命令上(当我尝试保存堆栈的上下文时)GDB 在 eclipse 中崩溃(因为那里有一个断点?)有什么办法解决这个问题吗?在过去的六个小时里,我一直在互联网上搜索,似乎无法找到解决方案。这是崩溃的代码行

我将非常感谢任何可以提供帮助的人。

谢谢!

编辑:经过进一步搜索,我找到了这个网页,但不知道如何使用它。

http://www.delorie.com/gnu/docs/gdb/gdb_271.html

协助将不胜感激!

0 投票
3 回答
427 浏览

c - 自动变量和寄存器变量——优化一样吗?

我正在读APUE,当我来的时候longjmp,问题来了。书上说,优化前,自动变量和寄存器变量都存储在内存中,优化后,它们都存储在寄存器中。但是当我使用时objdump -S a.out,我发现它们都变成了立即操作数。所以 ?

0 投票
1 回答
2727 浏览

exception - OCaml internals: Exceptions

I'm curious to know how exceptions are dealt with in OCaml runtime to make them so lightweight. Do they use setjmp/longjmp or do they return a special value in each function, and propagate it?

It seems to me that longjmp would put a little strain on the system, but only when an exception is raised, while checking for each function return value would need to check for every and each value after calling a function, which seems to me would put a lot of checks and jumps, and it seems it would perform worst.

By looking at how OCaml interfaces with C ( http://caml.inria.fr/pub/docs/manual-ocaml/manual032.html#toc142 ), and looking at callback.h, it seems that an exception is tagged by using the memory alignment of objects ( #define Is_exception_result(v) (((v) & 3) == 2) ). This seems to indicate that its implementation doesn't use longjmp and checks each function result after each function call. Is that it? Or the C function already tries to catch any exception, and then converts it to this format?

Thank you!

0 投票
3 回答
2736 浏览

c - 为什么 setjmp/longjmp 在 MSVC 上没有在 MinGW 中崩溃?

我想用 setjmp()/longjmp()来实现一个协程系统。然后我决定编写一个小 .c 文件来测试它。在MinGW中,没关系;我得到了我想要的结果。但是当我在 MSVC++ 中编译它时,程序崩溃了:“访问冲突”

0 投票
1 回答
647 浏览

perl - use of Sys::SigAction::timeout_call unsafe?

I've just read Leon Timmermans' article What you should know about signal based timeouts and I was wondering how it/if it applies to the use of Sys::SigAction::timeout_call().

1) First of all, it seems that timeout_call() uses longjmp and unsafe signals, and therefore CERT Secure Coding rule SIG32-C is applicable.

2) Is timeout_call safe to use if the code being monitored for timeouts only contains pure-perl code (i.e. no calls to XS modules)?