我有一个故意在一个线程上进行段错误的程序,但我有一个问题,即另一个线程是segfaulting,我想用GDB捕获它,我看到我可以:
handle SIGSEGV nostop noprint
但是我只想在故意这样做的话题上做到这一点......是否可能?
我会解释: 我有2个线程,一个线程是segfaulting(并恢复(mprotect只读,然后释放内存)),工作正常,另一个线程做其他事情,但遗憾的是,有一个错误,它是segfaulting,我想抓住这是段错误,而不是其他线程中出现的其他错误。
答案 0 :(得分:0)
据我所知,取决于操作系统,我认为linux是我的答案,答案是“不”!
Posix异常每个线程可以有一个sigmask,但每个任务只能有一个处理程序。因此无法为每个线程设置不同的处理方式。 sigaction将为整个过程处理它。所以我认为gdb无法改变这一点。
答案 1 :(得分:0)
我将解释:我有2个线程,一个线程是segfaulting(并恢复(mprotect只读,然后释放内存)),这很好,另一个线程做了别的,但很遗憾,有一个错误,它是segfaulting,我想捕获那个段错误,而不是其他线程中出现的其他错误
你必须告诉gdb忽略第一个SIGSEGV信号。因此,在第一个sagfault之后,在此线程中使用signal 0
命令。您的程序将在gdb下继续执行,这就是您想要的。然后它会停在第二个线程中的第二个段错误中,这就是你要检查的内容。
(gdb) help signal
Continue program with the specified signal.
Usage: signal SIGNAL
The SIGNAL argument is processed the same as the handle command.
An argument of "0" means continue the program without sending it a signal.
This is useful in cases where the program stopped because of a signal,
and you want to resume the program while discarding the signal.
所以
handle SIGSEGV nostop noprint
。运行你的程序
GDB。signal 0
。你的计划
恢复执行。backtrace
查看
问题。或者如果你的两个线程彼此不依赖,你可以在第一个segfaulted的线程中等待,而另一个段错误发生。只要它导致段错误就在第一个线程中执行call sleep(60)
并在另一个线程中等待另一个段错误。你的第一个帖子将等待:
Program received signal SIGFPE, Arithmetic exception.
[Switching to Thread 0x7ffff7fde700 (LWP 25744)]
0x000000000040075d in my_thread_func1 (arg=0x0) at my_test_2.cpp:17
17 ptr1 = ptr1 / 0;
(gdb) call sleep(60)
Thread 140737343510272:
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff75dd700 (LWP 25745)]
0x00000000004007a3 in my_thread_func2 (arg=0x0) at my_test_2.cpp:27
27 *ptr2 = *ptr2 + 2;
The program received a signal in another thread while
making a function call from GDB.
Evaluation of the expression containing the function
(sleep) will be abandoned.
When the function is done executing, GDB will silently stop.
(gdb)