Home > Back-end >  gdb catch throw, this thread
gdb catch throw, this thread

Time:11-01

My binary (generated from C ) has two threads. When I care about exceptions, I care about exceptions thrown in one of them (the worker) but not the other.

Is there a way to tell gdb only to pay attention to one of the threads when using catch throw? The gdb manual (texinfo document) and googling suggest to me that this isn't possible, although I think I could request catching a specific type of exception, which hopefully only one of the threads would throw, using catch throw REGEXP.

CodePudding user response:

Is there a way to tell gdb only to pay attention to one of the threads

The catch throw is really just a fancy way to set a breakpoint on __cxxabiv1::__cxa_throw (or similar), and you can make a breakpoint conditional on thread number, achieving the equivalent result.

Example:

#include <pthread.h>
#include <unistd.h>

void *fn(void *)
{
  while(true) {
    try {
      throw 1;
    } catch (...) {}
    sleep(1);
  }
  return nullptr;
}

int main() {
  pthread_t tid;
  pthread_create(&tid, nullptr, fn, nullptr);
  fn(nullptr);
  return 0;
}

g   -g -pthread t.cc

Using catch throw, you would get a breakpoint firing on the main and the second thread. But using break ... thread 2 you would only get the one breakpoint you care about:

gdb -q a.out
Reading symbols from a.out...

(gdb) start
Temporary breakpoint 1 at 0x11d6: file t.cc, line 17.
Starting program: /tmp/a.out
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Temporary breakpoint 1, main () at t.cc:17
17        pthread_create(&tid, nullptr, fn, nullptr);
(gdb) n
[New Thread 0x7ffff7a4c640 (LWP 1225199)]

  ## Note: GDB refuses to set thread-specific breakpoint until the thread actually exists.

18        fn(nullptr);
(gdb) break __cxxabiv1::__cxa_throw thread 2
Breakpoint 2 at 0x7ffff7e40370: file ../../../../src/libstdc  -v3/libsupc  /eh_throw.cc, line 77.
(gdb) c
Continuing.
[Switching to Thread 0x7ffff7a4c640 (LWP 1225199)]

Thread 2 "a.out" hit Breakpoint 2, __cxxabiv1::__cxa_throw (obj=0x7ffff0000be0, tinfo=0x555555557dc8 <typeinfo for int@CXXABI_1.3>, dest=0x0) at ../../../../src/libstdc  -v3/libsupc  /eh_throw.cc:77
77      ../../../../src/libstdc  -v3/libsupc  /eh_throw.cc: No such file or directory.
(gdb) bt
#0  __cxxabiv1::__cxa_throw (obj=0x7ffff0000be0, tinfo=0x555555557dc8 <typeinfo for int@CXXABI_1.3>, dest=0x0) at ../../../../src/libstdc  -v3/libsupc  /eh_throw.cc:77
#1  0x00005555555551b5 in fn () at t.cc:8
#2  0x00007ffff7d7eeae in start_thread (arg=0x7ffff7a4c640) at pthread_create.c:463
#3  0x00007ffff7caea5f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
(gdb) c
Continuing.

Thread 2 "a.out" hit Breakpoint 2, __cxxabiv1::__cxa_throw (obj=0x7ffff0000be0, tinfo=0x555555557dc8 <typeinfo for int@CXXABI_1.3>, dest=0x0) at ../../../../src/libstdc  -v3/libsupc  /eh_throw.cc:77
77      in ../../../../src/libstdc  -v3/libsupc  /eh_throw.cc
(gdb) bt
#0  __cxxabiv1::__cxa_throw (obj=0x7ffff0000be0, tinfo=0x555555557dc8 <typeinfo for int@CXXABI_1.3>, dest=0x0) at ../../../../src/libstdc  -v3/libsupc  /eh_throw.cc:77
#1  0x00005555555551b5 in fn () at t.cc:8
#2  0x00007ffff7d7eeae in start_thread (arg=0x7ffff7a4c640) at pthread_create.c:463
#3  0x00007ffff7caea5f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95

Voilà -- thread-specific catch throw equivalent.

  • Related