【发布时间】:2013-06-08 21:25:27
【问题描述】:
我有一个 GUI 应用程序,我在 Ubuntu Linux 中使用 GCC 来构建它。应用程序正确构建并正确运行。问题是,当我通过菜单退出应用程序时,它退出但挂在控制台/终端上,直到我用 Ctrl+C 强制它。
这是我的代码(我已经删除了大部分内容,因为它正在节省东西)
void MainFrame::OnQuit(wxEvent& e)
{
Destroy();
delete m_pluginManager;
}
AFAIK Destroy() is supposed to destroy all children 并且窗口消失了(对我来说这意味着它已被破坏)但似乎有东西挂在那里
我已经按照下面一位朋友的建议尝试在 GDB 下运行,当它挂起时,我执行 Ctrl+C 并使用回溯,但我也无法理解 BT。在这里
回溯
0xb7fdd424 in __kernel_vsyscall ()
#1 0xb6f5cdcb in poll () at ../sysdeps/unix/syscall-template.S:81
#2 0xb66952db in g_poll () from /lib/i386-linux-gnu/libglib-2.0.so.0
#3 0xb66866d0 in ?? () from /lib/i386-linux-gnu/libglib-2.0.so.0
#4 0xb6686831 in g_main_context_iteration ()
from /lib/i386-linux-gnu/libglib-2.0.so.0
#5 0xb2351e80 in ?? ()
from /usr/lib/i386-linux-gnu/gio/modules/libdconfsettings.so
#6 0xb66abfc3 in ?? () from /lib/i386-linux-gnu/libglib-2.0.so.0
#7 0xb7034d78 in start_thread (arg=0xb21ffb40) at pthread_create.c:311
#8 0xb6f6c3de in clone () at ../sysdeps/unix/sysv/linux/i386/clone.S:131
我的 GCC 版本(如果有的话)
gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-linux-gnu/4.7/lto-wrapper
Target: i686-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.7.3-1ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.7/README.Bugs --enable-languages=c,c++,go,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.7 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.7 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --with-system-zlib --enable-objc-gc --enable-targets=all --with-cloog --enable-cloog-backend=ppl --disable-cloog-version-check --disable-ppl-version-check --enable-multiarch --disable-werror --with-arch-32=i686 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=i686-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu
Thread model: posix
gcc version 4.7.3 (Ubuntu/Linaro 4.7.3-1ubuntu1)
注意:我做了一些修改以反映问题的现状
【问题讨论】:
-
如果应用程序没有退出,则意味着它仍在做某事,就好像你的事件循环没有退出,只是窗口被隐藏了。更多代码,比如你如何退出,会很有趣。
-
已更新。代码很大,但我包含了真正退出的部分!
-
有人能告诉我为什么我得到了投票吗?有什么不清楚的吗?这无关紧要吗?还是什么?
-
尽管我没有投反对票,但这是可以理解的,因为您对 GCC 具有“不要退出但暂停程序”标志的假设是毫无根据的。
-
@Stefano 将代码添加到暂停不是编译器的工作,但如果存在,它将由 C++ 运行时库添加,该库围绕 main() 函数执行初始化程序和终结程序。无论如何,要查看事物暂停的位置,只需使用 GDB,让程序正常执行,最后暂停时按 CTRL+C,然后使用
backtrace命令查看您的确切位置。