gdb nostop SIGSEGV在特定的线程上

时间:2014-04-29 11:10:13

标签: c++ c linux gdb sigsegv

我有一个故意在一个线程上进行段错误的程序,但我有一个问题,即另一个线程是segfaulting,我想用GDB捕获它,我看到我可以:

handle SIGSEGV nostop noprint

但是我只想在故意这样做的话题上做到这一点......是否可能?

我会解释: 我有2个线程,一个线程是segfaulting(并恢复(mprotect只读,然后释放内存)),工作正常,另一个线程做其他事情,但遗憾的是,有一个错误,它是segfaulting,我想抓住这是段错误,而不是其他线程中出现的其他错误。

2 个答案:

答案 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.

所以

  1. 请勿使用handle SIGSEGV nostop noprint。运行你的程序 GDB。
  2. 当它在前三个段中发生段错误时signal 0。你的计划 恢复执行。
  3. 然后它在另一个线程中进行了段错误。现在使用backtrace查看 问题。
  4. 或者如果你的两个线程彼此不依赖,你可以在第一个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)