开发者社区 > 数据库 > 正文

OB中有一个关于gdb调试oceanbase的问题,请问这是什么原因啊?

OB中有一个关于gdb调试oceanbase的问题。用gdb attach到observer进程后,打断点到ob_query_response_time.cpp:178,然后通过obclient直接连接的方式连接到数据库,执行创建表的操作,命令直接就执行成功了,程序没有停到我刚才打的断点那里。请问这是什么原因啊?lQLPJxbeiuSpqcbNA7nNB0-wysa5RJpjj8QDba4V44BAAA_1871_953.pnglQLPJxbeixa7DibNATDNBWawMPRpcBGwW6IDba5oGMCRAA_1382_304.png

展开
收起
fuxixi 2022-11-14 16:01:22 491 0
6 条回答
写回答
取消 提交回答
  • 你需要确认一下观察器服务是否已经启动并在监听端口上接受请求。如果没有的话,你需要启动它才能使GDB能够捕获到它的信号。

    即使观察器正在运行,你也需要注意的是,当您在一个进程中附加另一个进程时,该被附加进程的所有子进程也会受到影响。这意味着如果您希望只监视特定的线程而不是整个进程,您应该考虑使用更为精细的方法,例如仅附加目标线程所在的PID,这样就不会影响其他的线程。

    虽然您的问题是关于如何让程序暂停在某个位置以便于调试,但请注意,有些情况下,像MySQL这样的服务器软件会在接收到客户端请求之后立即返回响应结果给客户端,而不会等待任何后续处理完成后再发送最终的结果。这种行为被称为“同步回显”(Synchronous Result Set)。在这种模式下,服务器并不会阻塞直到所有请求都被完全处理完毕才向客户端报告状态更新;相反,一旦有第一个请求开始接收回复,服务器就会立即将这部分内容发回到客户端。这就是为何您看到的现象可能是正常的——因为在这个阶段,服务器已经开始回应客户端的第一个请求,所以并没有达到预期中的断点处。

    要解决这种情况,您可以尝试禁用同步回显功能,或者选择一种允许您控制何时获取结果集的状态方式。另外,也可以考虑使用异步通信协议,这种方式可以让服务器在不依赖于客户端的情况下继续处理其它任务,而不必一直等到所有请求全部结束为止。

    2024-01-09 16:07:23
    赞同 展开评论 打赏
  • 十分耕耘,一定会有一分收获!

    楼主你好,如果通过attach方式将gdb连接到observer进程,并设置了断点,但执行命令时程序没有停到断点处,可能是调试符号未匹配,请确保你使用的是与运行中的OceanBase版本一致的调试符号,如果调试符号与程序版本不匹配,断点可能无法正确触发。

    还有是不是启用了Just-In-Time编译(JIT),因为在某些情况下,如果你的程序启用了Just-In-Time编译,比如使用了JIT编译器LLVM,可能会导致断点失效。

    2024-01-03 19:20:29
    赞同 展开评论 打赏
  • 如果你的 OceanBase 服务是以 Release 模式编译的,可能会有优化选项使得行号信息不准确,或者某些代码被优化掉了。确保你的服务是以 Debug 模式编译的,并且源码与你正在运行的二进制版本匹配。

    2024-01-02 20:48:32
    赞同 1 展开评论 打赏
  • 天下风云出我辈,一入江湖岁月催,皇图霸业谈笑中,不胜人生一场醉。

    检查GDB的配置文件gdbinit是否正确。如果配置文件中缺少相关的选项,可能会导致程序无法正确停到指定的断点。您可以检查一下gdbinit文件是否包含了以下内容:

    set follow-symbols yes
    

    检查GDB是否正确识别了断点所在的文件和行号。如果GDB无法正确识别断点,程序将无法停到断点所在的位置。您可以使用gdb命令查看程序的调试信息
    这将显示程序的所有局部变量和常量,以及它们的值。如果您无法找到断点所在的行号,您可以尝试将断点移动到程序的其他地方,然后重新执行程序,看看是否能够停到正确的位置。
    检查程序中是否存在死循环或无限递归等情况。如果程序中存在这些情况,程序将无法停到正确的位置。您可以通过修改程序代码来排除这些情况。

    2023-12-29 10:35:55
    赞同 展开评论 打赏
  • 北京阿里云ACE会长

    问题可能是由于以下几个原因导致的:

    1. 断点设置不正确:请检查您的断点设置是否正确。根据您提供的信息,您将断点打在了ob_query_response_time.cpp:178处。请确保您在正确的位置设置了断点。
    2. 代码逻辑:在创建表的操作之前,可能存在一些逻辑使得程序没有按照预期执行到断点处。请检查相关代码逻辑,确保在执行创建表操作之前,程序能够正确地执行到断点处。
    3. 数据或环境问题:有时候,数据或环境问题可能导致程序的行为不符合预期。请检查您的测试数据和环境设置,确保它们是正确的。
    4. 其他进程或线程干扰:在GDB调试过程中,可能会有其他进程或线程干扰到调试进程。请检查您的系统是否有其他进程或线程在运行,并确保它们不会影响到您的调试进程。
      为了解决这个问题,您可以尝试以下方法:
    5. 仔细检查您的断点设置,确保它设置在正确的位置。
    6. 通过单步执行或查看调试日志,找到程序执行到断点之前的逻辑,确保没有遗漏或错误的代码。
    7. 检查您的测试数据和环境设置,确保它们是正确的。
    2023-12-27 20:42:22
    赞同 展开评论 打赏
  • 程序可能在执行创建表操作之前就已经到达了断点。

    本篇教程介绍在 OceanBase 开发者中心(OceanBase Developer Center,ODC)中调试一个存储过程的详细步骤。https://www.oceanbase.com/quicksearch?q=%E6%89%93%E6%96%AD%E7%82%B9&scope=docs

    image.png

    https://www.oceanbase.com/docs/common-oceanbase-cloud-10000000001781504

    2023-12-27 11:41:27
    赞同 展开评论 打赏
滑动查看更多

数据库领域前沿技术分享与交流

相关电子书

更多
Graph图数据库基础介绍及场景 立即下载
PostgresChina2018_邵宗文_图数据库及应用场景 立即下载
自研金融数据库OceanBase的创新之路 立即下载