gdb kernel debug的进程断点

  1. 云栖社区>
  2. 博客列表>
  3. 正文

gdb kernel debug的进程断点

stormbm 2018-05-11 10:25:28 浏览9617 评论0

摘要: gdb调试kernel的时候, 如果设置通用函数断点, 比如vfs_read, 就会遇到一堆撞到断点的地方, 比如tty输入一个字符, 就是vfs_read, 没办法调试具体的某一个进程 一种办法就是条件断点, 其实不是很好用, 比如用pid, 但是有时候这个进程还没启动, 比如task的comm来判定, 但是kernel中是不支持strcmp来判断字符串是否相等, 因为需要跑函数 g

gdb调试kernel的时候, 如果设置通用函数断点, 比如vfs_read, 就会遇到一堆撞到断点的地方, 比如tty输入一个字符, 就是vfs_read, 没办法调试具体的某一个进程

一种办法就是条件断点, 其实不是很好用, 比如用pid, 但是有时候这个进程还没启动, 比如task的comm来判定, 但是kernel中是不支持strcmp来判断字符串是否相等, 因为需要跑函数

gdb 7.5对此问题做了增强, gdb自己去比较字符串, 而不需要机器去跑代码

https://sourceware.org/gdb/current/onlinedocs/gdb/Convenience-Funs.html#Convenience-Funs

b do_fault if $_streq($lx_current()->comm, "a.out")

还可以对调用者来做条件断点, 比如a->c, b->c, 断点只停在b调用c的地方

$_caller_is(name[, number_of_frames])

    Returns one if the calling function’s name is equal to name. Otherwise it returns zero.

    If the optional argument number_of_frames is provided, it is the number of frames up in the stack to look. The default is 1.

    Example:

    (gdb) backtrace
    #0  bottom_func ()
        at testsuite/gdb.python/py-caller-is.c:21
    #1  0x00000000004005a0 in middle_func ()
        at testsuite/gdb.python/py-caller-is.c:27
    #2  0x00000000004005ab in top_func ()
        at testsuite/gdb.python/py-caller-is.c:33
    #3  0x00000000004005b6 in main ()
        at testsuite/gdb.python/py-caller-is.c:39
    (gdb) print $_caller_is ("middle_func")
    $1 = 1
    (gdb) print $_caller_is ("top_func", 2)
    $1 = 1

用云栖社区APP,舒服~

【云栖快讯】诚邀你用自己的技术能力来用心回答每一个问题,通过回答传承技术知识、经验、心得,问答专家期待你加入!  详情请点击

网友评论

stormbm
文章21篇 | 关注13
关注
云数据库PPAS版,是阿里云与EnterpriseDB公司合作基于PostgreSQL高度兼... 查看详情
PostgreSQL被业界誉为“最先进的开源数据库”,面向企业复杂SQL处理的OLTP在线事... 查看详情
一站式提供企业即时通讯、销售管理、协同办公。 查看详情
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效... 查看详情
阿里云总监课正式启航

阿里云总监课正式启航