GTK3应用通过gdb启动时无法显示窗口的技术问询
GTK3应用GDB调试启动窗口无法显示问题
问题现象
执行gdb ./myapp可正常加载所有调试符号,但在GDB中执行run命令后,应用窗口无法打开,仅输出大量线程相关日志:
Starting program: /home/user/build/GTKapp/myapp [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". [New Thread 0x7fffe3fff6c0 (LWP 146369)] [New Thread 0x7fffe37fe6c0 (LWP 146370)] [New Thread 0x7fffdaffd6c0 (LWP 146371)] [New Thread 0x7fffca3ff6c0 (LWP 146372)] [New Thread 0x7fffc9bfe6c0 (LWP 146373)] [New Thread 0x7fffc93fd6c0 (LWP 146374)] [Thread 0x7fffc93fd6c0 (LWP 146374) exited] [New Thread 0x7fffc93fd6c0 (LWP 146375)] [New Thread 0x7fffbbfff6c0 (LWP 146376)] [Thread 0x7fffc93fd6c0 (LWP 146375) exited] [New Thread 0x7fffc93fd6c0 (LWP 146377)] [New Thread 0x7fffbb7fe6c0 (LWP 146378)] [Thread 0x7fffc93fd6c0 (LWP 146377) exited] [Thread 0x7fffbbfff6c0 (LWP 146376) exited] [Thread 0x7fffbb7fe6c0 (LWP 146378) exited] [New Thread 0x7fffbb7fe6c0 (LWP 146379)] [New Thread 0x7fffbbfff6c0 (LWP 146380)] [New Thread 0x7fffc93fd6c0 (LWP 146381)] [New Thread 0x7fffbaffd6c0 (LWP 146384)] [New Thread 0x7fffba7fc6c0 (LWP 146385)] [New Thread 0x7fffb9ffb6c0 (LWP 146386)] [New Thread 0x7fffb97fa6c0 (LWP 146387)] [New Thread 0x7fffb8ff96c0 (LWP 146388)] [Thread 0x7fffba7fc6c0 (LWP 146385) exited] [Thread 0x7fffbaffd6c0 (LWP 146384) exited] [Thread 0x7fffc93fd6c0 (LWP 146381) exited] [Thread 0x7fffbbfff6c0 (LWP 146380) exited] [Thread 0x7fffbb7fe6c0 (LWP 146379) exited]
应用直接运行时窗口可正常打开,也可通过先启动应用再用GDB附加的方式调试,但希望能直接从GDB内部启动应用。
应用启动代码
int main(int argc, char **argv) { auto app = Gtk::Application::create(argc, argv, APPID); Glib::MainContext::get_default()->push_thread_default(); System system(argc, argv); return app->run(system.getWindow() ); }
解决方案
传递正确的显示环境变量:在GDB中执行
run前,先设置DISPLAY变量:set env DISPLAY=:0也可启动GDB时直接指定:
gdb -ex 'set env DISPLAY=:0' ./myapp关闭线程自动打印:频繁的线程创建销毁日志会干扰输出,执行以下命令关闭通知:
set print thread-events off再执行
run,可更清晰查看应用的报错信息。修复线程上下文问题:代码中手动push主线程上下文但未弹出,可能导致冲突。修改代码确保上下文正确清理:
int main(int argc, char **argv) { auto app = Gtk::Application::create(argc, argv, APPID); auto default_context = Glib::MainContext::get_default(); default_context->push_thread_default(); System system(argc, argv); int result = app->run(system.getWindow() ); default_context->pop_thread_default(); // 新增弹出操作 return result; }或者直接移除
push_thread_default()调用,Gtk::Application会自动管理主线程上下文。使用
starti替代run:starti会停在程序第一条指令,再用continue继续执行,可规避部分启动环境问题:starti continue
内容的提问来源于stack exchange,提问作者Enter Display Name Here
相关产品推荐
相关产品推荐

