【问题标题】:Application Exits and then Hangs in Console应用程序退出,然后在控制台中挂起
【发布时间】: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 命令查看您的确切位置。

标签: c++ gcc wxwidgets


【解决方案1】:

Here's wxWidgets 的 Hello World。

规范的退出处理程序是这样的:

void MainFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
{
    Close(true);
}

【讨论】:

猜你喜欢
  • 2015-10-13
  • 1970-01-01
  • 1970-01-01
  • 2018-12-07
  • 2014-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-04
相关资源
最近更新 更多