gpt4 book ai didi

java - 为什么在遇到断点时使用 JAR 应用程序的 GDB 调试 native 代码会挂起 Ubuntu UI(X11 进程)?

转载 作者:太空宇宙 更新时间:2023-11-04 02:46:24 27 4
gpt4 key购买 nike

我的项目基本上是一个像 lync 这样的通信客户端,它是用 JAVA 为前端 (GUI) 开发的,并使用平台特定的 native 代码(C 或 C++)来运行服务。

现在,在 Linux (Ubuntu 12.04) 上,一旦调用 JAR 应用程序,它就会加载所有 native 代码共享库,并且 UI 线程开始执行。在 UI 中完成的任何操作都会向 C 中的 native 代码抛出一个事件。因此,目前我需要调试 C/C++ 用户库中的崩溃,当我在 UI 下拉列表中执行某些操作时会触发该崩溃。

我正在使用 GDB,附加到进程的 PID,(sudo gdb -p),所有符号都已加载,我能够为库中的 A() 函数设置断点。继续后GDB 中的命令,我从 UI 下拉列表中选择实例,并在函数 A() 处命中断点。此刻,我的 ubuntu 机器挂了,没有键盘中断在工作。我只能移动我的鼠标指针,但不能点击任何东西。

但是,为了验证内核没有关闭,我可以 ping 机器,甚至可以使用 SSH。一旦 SSH 调用相同的 GDB,就不会遇到上述问题。任何人都可以在这里帮助我了解为什么 UI 或 X11 进程在上述情况下挂起。

PS: 是的,有很多线程在运行,这可能是线程死锁的情况,但在 SSH 终端调用 GDB 时不会发生这种情况。

感谢和问候,因陀罗

最佳答案

why UI or X11 process hangs during the above scenario

正如 Mark Plotnick 正确指出的那样,X11 进程不会挂起。相反,它会捕获键盘(所有键盘事件都被分派(dispatch)给它),并且不能释放该抓取(它在到达释放点之前被 GDB 停止)。

有两种常见的解决方案:

  1. 要求申请 not do the keyboard grab (如马克所说),或
  2. 从单独的机器调试应用程序(这甚至可以在单个物理机器上完成:只需在 VM 内运行应用程序)。

附言为什么应用程序菜单会占用键盘?因为按 Esc 通常会关闭菜单,而无论应用程序是否具有输入焦点,他们都希望看到 Esc

关于java - 为什么在遇到断点时使用 JAR 应用程序的 GDB 调试 native 代码会挂起 Ubuntu UI(X11 进程)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26824554/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com