0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

通过GDB non-stop mode调试MySQL

数据库和存储 来源: MySQL内核剖析 2023-09-25 10:34 次阅读

通过GDB non-stop mode 调试MySQL, 特别是用于复现死锁场景, 需要按照一定的并发顺序写入才可以构造出来, 通过GDB non-stop mode 可以非常方便进行构造

但是用法是先开启 GDB, 然后在 attach mysql_pid 才可以. 不能启动的时候就 attach 到 mysql pid

可以通过设置set non-stop on, non-stop mode 来实现gdb 只block 一个thread, 然后其他thread 继续执行的方法.

In non-stop mode, when a thread stops to report a debugging event, only that thread is stopped;

经常需要配合这几个一起用

set target-async 1

set pagination off

set non-stop on

这一行可以直接启动的时候就设置好

gdb —quiet -ex ‘set pagination off’ -ex ‘set target-async on’ -ex ‘set non-stop on’

0f160ade-5b4c-11ee-939d-92fbcf53809c.png

在 non-stop mode 里面, 如果断点被某一个线程命中, 那么只有该线程是停止的, 其他线程继续 running.. 上图可以看到只有 Thread 66 是停止的, 其他 Thread 都在运行钟.

在 non-stop mode 中, 如果想让其他所有 Thread 继续运行, 需要执行 c -a(continue -a), 如果只是执行 c(continue), 那么只有当前 thread 运行.

通过 continue 只运行当前 Thread, 就可以切换 Thread, 执行 continue, 做到多个 Thread 轮流运行的效果, 用于复杂场景复现.

比如这个 example 把断点打在 do_command 上面, 那么就两个 client 连接进来执行 命令以后, 都停止在了 do_command 上, 这个时候可以按照我们的需求去执行哪一个 thread.

0f223eee-5b4c-11ee-939d-92fbcf53809c.png

比如我这里又增加了一个 breakpoint lock_rec_lock, 我想让 Thread 66 先执行, 那么我就t 66, 然后在这里执行 continue, 那么就会发现 t 66 跳到下一个断点.

0f354c5a-5b4c-11ee-939d-92fbcf53809c.png

这个时候可以再切到 Thread 67 让他去执行, 因为 Thread 66 已经断在一个地方了. 这个时候我们直接让 Thread 67 执行完成就变成这样

0f3b79c2-5b4c-11ee-939d-92fbcf53809c.png

可以看到 Thread 66 还停在这里, 但是 Thread 67 已经执行结束了.

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内核
    +关注

    关注

    3

    文章

    1309

    浏览量

    39846
  • 调试
    +关注

    关注

    7

    文章

    527

    浏览量

    33625
  • MySQL
    +关注

    关注

    1

    文章

    775

    浏览量

    26004

原文标题:通过GDB non-stop mode 调试MySQL

文章出处:【微信号:inf_storage,微信公众号:数据库和存储】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    QEMU+GDB调试ARM程序

    通过GDB调试代码的便利性无需赘言。我们直接以调试meta-hypervisor为示例进行说明。
    的头像 发表于 10-08 09:17 2337次阅读

    使用GDB调试Linux应用程序

    本篇讲解使用GDB调试Linux应用程序,以下以 `hellowld.c` 为例介绍 GDB调试入门。
    发表于 06-27 15:48 337次阅读

    GDB调试命令手册

    GDB调试命令手册,感兴趣的可以下载看看。
    发表于 11-05 16:36 9次下载

    在Linux中如何使用gdb调试C程序?

    通俗的讲,GDB 可以让你看到程序在执行过程时的内部流程,并帮你明确问题的所在。我们将在下一节通过一个有效的示例来讨论 GDB 调试器的用法,但在此之前,我们先来探讨一些之后对你有帮助
    发表于 04-28 15:37 1562次阅读

    GDB调试命令总结

    的话,默认是会启动所有线程。这种模式有一种副作用,如果多个线程都断在同一个函数,这时候调试会出问题。这个时候需要打开线程锁,但打开线程锁,意味着其它线程不能运行了。(2)non-stop模式(7.0以后
    发表于 04-02 14:31 1007次阅读

    嵌入式Linux的GDB调试环境建立

    嵌入式Linux的GDB调试环境由Host和Target两部分组成,Host端使用arm-linux-gdb,Target Board端使用gdbserver。这样,应用程序在嵌入式
    发表于 04-02 14:33 394次阅读

    使用 GDB 调试多进程程序

    的特点或者其他一些辅助手段来达到目的。此外,GDB 也在较新内核上加入一些多进程调试支持。接下来我们详细介绍几种方法,分别是 follow-fork-mode 方法,attach 子进程方法和
    发表于 04-02 14:33 453次阅读

    Linux应用的GDB调试的原理及过程分析

    GDB调试是应用程序在开发板上运行,然后在PC机上对开发板上得应用程序进行调试,PC机运行GDB,开发板上运行GDBServer。在应用程序调试
    发表于 03-05 09:44 3188次阅读
    Linux应用的<b class='flag-5'>GDB</b><b class='flag-5'>调试</b>的原理及过程分析

    嵌入式Linux GDB调试环境搭建与使用

    /跳出函数、设置断点、查看变量等等。Ubuntu资源充足,可以直接用gdb调试程序。嵌入式Linux性能弱,一般PC上运行源码和GDB工具,可执行文件在开发板上运行。PC上通过
    发表于 11-01 17:59 8次下载
    嵌入式Linux <b class='flag-5'>GDB</b><b class='flag-5'>调试</b>环境搭建与使用

    Linux嵌入式 gdb VSCode图形化调试教程

    文章目录介绍GDB简介交叉编译器的gdb介绍在学习单片机的时候我们可以通过集成式IDE 来进行调试,比如MDK、IAR 等。在嵌入式linux 领域是否也可以进行
    发表于 11-02 12:21 15次下载
    Linux嵌入式 <b class='flag-5'>gdb</b> VSCode图形化<b class='flag-5'>调试</b>教程

    LPUART 唤醒STOP MODE 下的MCU

    前言 在很多低功耗应用中都需将MCU 进入STOP MODE 以节省更多的功耗,但是在以前的架构中,如果要达到这种应用,只能在进入低功耗模式之前将串口的管脚设置成普通的GPIO 的中断模式,虽然
    发表于 11-16 10:06 12次下载
    LPUART 唤醒<b class='flag-5'>STOP</b> <b class='flag-5'>MODE</b> 下的MCU

    在ubuntu中调试GDB

    的 gcc 编译器即可,注意需要加 -g 选项,才能使用 gdb 调试 arm-linux-gnueabihf-gcc gdbtest .c -o gdbtest -g //编译测试程序,注意-g 选项
    的头像 发表于 07-27 16:31 640次阅读
    在ubuntu中<b class='flag-5'>调试</b><b class='flag-5'>GDB</b>

    GDB调试工具的原理

    一、GDB调试工具的原理 1.1 未执行进程调试 启用gdb调试运行gdb ./test的时候,
    的头像 发表于 11-09 17:04 320次阅读
    <b class='flag-5'>GDB</b><b class='flag-5'>调试</b>工具的原理

    如何使用GDB调试工具

    在对应程序目录中使用下面的命令 gdb test 2、调试已经开始运行的程序进程 调试已经开始运行的程序进程,首先先用top命令查看运行的程序进程的pid如下: 比如我要加载的程序
    的头像 发表于 11-09 17:17 332次阅读
    如何使用<b class='flag-5'>GDB</b><b class='flag-5'>调试</b>工具

    如何使用linux下gdb调试python程序

    如何使用linux下gdb调试python程序  在Linux下,可以使用GDB(GNU调试器)来调试Python程序。
    的头像 发表于 01-31 10:41 461次阅读