You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 16:15:41