C++ 创建用于调试目的的 SIGSEGV

C++ Creating a SIGSEGV for debug purposes

提问人:RaptorIV 提问时间:2/27/2012 最后编辑:RaptorIV 更新时间:8/19/2015 访问量:8106

问:

我正在开发一个无锁共享变量类,我希望能够生成一个 SIGSEGV 错误,以查看我的实现是否按我的计划工作。我尝试创建一个修改指针并读取 100 次的函数。然后,我在两个线程中调用此函数,并让线程在我的程序中无限运行。这不会生成我想要的错误。我应该如何去做?

编辑我根本不处理段错误,但是如果我删除锁,它们会在我的程序中生成。我想使用无锁设计,因此我创建了一个共享变量类,该类使用 CAS 保持无锁。有没有办法让一段代码生成段错误,这样我就可以使用我的类来测试它是否解决了问题?

C++ 多线程 分段错误

评论

3赞 Lightness Races in Orbit 2/27/2012
这到底是怎么回事?你到底会尝试用 SIGSEGV 做什么?这完全没有意义。请向我们解释您要解决的问题。您是否创建了一个程序,试图通过拦截和丢弃分段错误来对问题做出反应?这与你无关吗? 180º 转弯是第一步。How should I go about doing this?
5赞 Ben Voigt 2/27/2012
@Lightness:如果你试图编写一个异常安全的智能指针,你不认为你应该在发生异常时对行为进行单元测试吗?这看起来像一个类似的想法。
2赞 RaptorIV 2/27/2012
我这样做的目的无关紧要,我只需要知道如何产生段错误
2赞 Ben Voigt 2/27/2012
@LightnessRacesinOrbit:因此,如果持有锁定的进程死亡,可以永久锁定共享资源吗?您的方法将可能的数据丢失转变为有保证的数据丢失。
2赞 BoBTFish 2/27/2012
这够好吗?kill -s SIGSEGV <pid>
3赞 Mysticial 2/27/2012
放松一下,在编写/测试容错代码时,这种事情相当普遍。

答:

6赞 Ben Voigt 2/27/2012 #1

malloc + mprotect+ 取消引用指针

mprotect 手册页有一个示例。

23赞 Flexo 2/27/2012 #2
#include <signal.h>

raise(SIGSEGV);

将导致发出适当的信号。

评论

0赞 RaptorIV 2/27/2012
我需要通过取消引用无效指针之类的东西来生成信号
0赞 Lightness Races in Orbit 2/27/2012
@RaptorIV:解释为什么你关心产生信号的是什么。
0赞 RaptorIV 2/27/2012
它需要在真实环境中生成,就好像是多线程程序造成的一样。我根本没有处理它,我只需要看到我的程序因此而崩溃,所以我可以在实现我的类时看到它是否不存在
0赞 Flexo 2/27/2012
像这样发出信号(有一些警告)将被视为“真正的”段错误,信号将被传递,如果存在异常处理程序,则将调用异常处理程序。从任何意义上讲,它仍然是一个“真实”的信号,如果它用于测试,那么如果不出意外,它是一个很好的起点。
4赞 Tudor 2/27/2012 #3

取消引用指向未分配内存的指针(至少在我的系统上):

int *a;
*a = 0;