当异常发生时,使用gdb程序会冻结

3

我使用g++编译了一个简单的测试程序:

int main()
{
  try
  {
    printf("before\n");
    throw 1;
  }
  catch(int i)
  {
    printf("catched int\n");
  }
  catch(...)
  {
    printf("catched(...)\n");
  }
}

通常情况下,无论是否包含调试信息,都可以正常运行。但是在使用gdb进行调试时,它总是在"throw 1;"这一行陷入死循环,因此我无法调试通常会抛出异常的程序。调试器提供的最后一个信息是:

Catchpoint 1 (exception thrown), 0x00007ffff7b8f9e0 in __cxa_throw () from /usr/lib/libstdc++.so.6

我的编译和链接选项:

g++ -Wshadow -Wunreachable-code -Wswitch-enum -Wswitch-default -Wextra -Wall  -pg -g -m64    -c main.cpp

g++ -o exec/exception_problem obj/main.o -pg

我的环境: Ubuntu 10.10,64位; g++/gcc 4.4.5; gdb 7.2; 在CodeBlocks SVN版本7440下调试。

有什么想法是问题所在吗?

附加信息: gdb日志的最后两行为:

Catchpoint 1 (exception thrown), 0x00007ffff7b8f9e0 in __cxa_throw () from /usr/lib/libstdc++.so.6
>>>>>>cb_gdb:

日志中最后一个字符是冒号。 gdb命令行:

/usr/bin/gdb -nx -fullname -quiet -args exec/exception_problem 

我在我的主目录中没有找到任何 *gdbinit* 文件;全局的 gdbinit 是空的。是不是 CodeBlocks 准备了特定的 gdbinit 文件并且将其放入 gdb 中呢?
祝好。

它是如何“挂起”的?你会得到一个(gdb)提示符吗?如果按下Ctrl+C或Ctrl+Z会发生什么? - themel
Ctrl+C可以关闭程序和终端窗口,但是在CodeBlocks中的调试会话仍然处于活动状态(调试日志中没有新信息)。之后,我可以使用停止按钮正常结束会话。 - ardabro
1个回答

1

Catchpoint 1 (exception thrown) ...

你的 .gdbinit 中是否有什么你没有告诉我们的东西?(也许是 catch throw ?)

Catchpoint 1 真的是 GDB 打印的最后一行吗?这是我看到的内容:

Reading symbols from /tmp/a.out...done.
Catchpoint 1 (throw)
(gdb) run
before
Catchpoint 1 (exception thrown), __cxxabiv1::__cxa_throw (obj=0x602090, tinfo=0x601060, dest=0) at ../../../../src/libstdc++-v3/libsupc++/eh_throw.cc:70
70  ../../../../src/libstdc++-v3/libsupc++/eh_throw.cc: No such file or directory.
    in ../../../../src/libstdc++-v3/libsupc++/eh_throw.cc
(gdb) c
catched int
[Inferior 1 (process 16008) exited normally]
(gdb) q

实际上,最后两行是: Catchpoint 1 (exception thrown),0x00007ffff7b8f9e0在/usr/lib/libstdc++.so.6中的__cxa_throw()中
cb_gdb: 日志中的最后一个字符是冒号。 gdb命令行: /usr/bin/gdb -nx -fullname -quiet -args exec/exception_problem
我在我的主目录中没有找到任何gdbinit;全局gdbinit为空。Codeblocks是否会准备特定的gdbinit并将其放入gdb中?
- ardabro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接