注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

gmd20的个人空间

// 编程和生活

 
 
 

日志

 
 

ltrace 跟踪打印动态链接库里面的函数调用  

2014-08-29 13:28:21|  分类: linux相关 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
这个看起来很cool的一个工具啊,之前只知道有个一个strace可以跟踪系统调用,
确不知道有ltrace这么一个有用的东西。不但可以跟踪syscall还可以打印出各个so文件里面函数调用。
我觉得这个是一个很有用的功能,有时候想看一下代码执行流程,比较有用。
之前想达到这个目的,需要用systemtap 之类的神器,利用call graph 脚本功能可以打印出清楚的函数带哦用关系。
不过略显麻烦,systermtap的优势是可以跟踪内核代码吧。 当然内核的ftrace的 graph功能也是不错的。

发现ltrace有一个比较致命的缺陷,不能跟踪用libdl(dlopen)动态加载so文件。有人在这里尝试解决这个问题,但好像很久没更新了。这个patch也没有被收录到最新的ltrace里面去。
http://timetobleed.com/extending-ltrace-to-make-your-rubypythonperlphp-apps-faster/
https://github.com/ice799/ltrace/tree/libdl

还有就是有时自己代码里面符号,也没有显示,不知道是不是要配置一下 /etc/ltrace.conf才行。

只是发现 syscall的那些libc之类的标准库的函数现实比较正常, 有时还需要需要 -f 参数来对子线程也进行跟踪。但对自己代码的函数不能跟踪太不友好了,调试符号都是已经有了的。 如果是这样还不如直接使用systemtap方便了。


这个ltrace 使用来打印用户空间代码的调用栈那是他方便了。比如

http://man7.org/linux/man-pages/man1/ltrace.1.html
bright@ubuntu:~/test$ ltrace  -C -n 2 -l libc* ls
ls->__libc_start_main(0x8049cf0, 1, 0xbf983114, 0x805a390 <unfinished ...>
  ls->setlocale(LC_ALL, "" <unfinished ...>
    libc.so.6->malloc(5)                                                   = 0x907b008
    libc.so.6->malloc(16)                                                  = 0x907b018
    libc.so.6->malloc(60)                                                  = 0x907b030
    libc.so.6->malloc(12)                                                  = 0x907b008
    libc.so.6->malloc(392)                                                 = 0x907b070
    libc.so.6->malloc(60)                                                  = 0x907b200
    libc.so.6->malloc(480)                                                 = 0x907b240
    libc.so.6->malloc(112)                                                 = 0x907b428
    libc.so.6->malloc(220)                                                 = 0x907b4a0
    libc.so.6->malloc(56)                                                  = 0x907b580
    libc.so.6->malloc(48)                                                  = 0x907b5c0
    libc.so.6->malloc(64)                                                  = 0x907b5f8
    libc.so.6->malloc(88)                                                  = 0x907b640
    libc.so.6->malloc(56)                                                  = 0x907b6a0
    libc.so.6->malloc(44)                                                  = 0x907b6e0
    libc.so.6->malloc(100)                                                 = 0x907b710
    libc.so.6->malloc(12)                                                  = 0x907b778
    libc.so.6->malloc(12)                                                  = 0x907b788
    libc.so.6->malloc(12)                                                  = 0x907b798
    libc.so.6->malloc(12)                                                  = 0x907b7a8
    libc.so.6->malloc(12)                                                  = 0x907b7b8
    libc.so.6->malloc(12)                                                  = 0x907b7c8
    libc.so.6->malloc(12)                                                  = 0x907b7d8
    libc.so.6->malloc(12)                                                  = 0x907b7e8
    libc.so.6->malloc(12)                                                  = 0x907b7f8
    libc.so.6->malloc(12)                                                  = 0x907b808
    libc.so.6->malloc(12)                                                  = 0x907b818
    libc.so.6->malloc(12)                                                  = 0x907b828
    libc.so.6->malloc(12)                                                  = 0x907b838
  <... setlocale resumed> )                                                = "en_US.UTF-8"
  ls->bindtextdomain("coreutils", "/usr/share/locale" <unfinished ...>
    libc.so.6->malloc(22)                                                  = 0x907b848
  <... bindtextdomain resumed> )                                           = "/usr/share/locale"
  ls->textdomain("coreutils" <unfinished ...>
    libc.so.6->malloc(10)                                                  = 0x907b868
  <... textdomain resumed> )                                               = "coreutils"
  ls->__cxa_atexit(0x8051c50, 0, 0, 0xb7708000)                            = 0
  ls->isatty(1)                                                            = 1
  ls->getenv("QUOTING_STYLE")                                              = nil
  ls->getenv("COLUMNS")                                                    = nil
  ls->ioctl(1, 21523, 0xbf982d44)                                          = 0
  ls->getenv("TABSIZE")                                                    = nil
  ls->getopt_long(1, 0xbf983114, "abcdfghiklmnopqrstuvw:xABCDFGHI:"..., 0x805aea0, -1) = -1
  ls->getenv("LS_BLOCK_SIZE")                                              = nil
  ls->getenv("BLOCK_SIZE")                                                 = nil
  ls->getenv("BLOCKSIZE")                                                  = nil
  ls->getenv("POSIXLY_CORRECT")                                            = nil
  ls->getenv("BLOCK_SIZE")                                                 = nil
  ls->__errno_location()                                                   = 0xb75126c4
  ls->malloc(48)                                                           = 0x907b878
  ls->__errno_location()                                                   = 0xb75126c4
  ls->malloc(48)                                                           = 0x907b8b0
  ls->malloc(12800)                                                        = 0x907b8e8
  ls->malloc(16)                                                           = 0x907eaf0
  ls->malloc(2)                                                            = 0x907eb08
  ls->__errno_location()                                                   = 0xb75126c4
  ls->opendir("." <unfinished ...>
    libc.so.6->malloc(32796)                                               = 0x907eb18
  <... opendir resumed> )                                                  = 0x907eb18
  ls->readdir64(0x907eb18)                                                 = 0x907eb34
  ls->readdir64(0x907eb18)                                                 = 0x907eb4c
  ls->malloc(9)                                                            = 0x9086b38
  ls->readdir64(0x907eb18)                                                 = 0x907eb6c
  ls->malloc(23)                                                           = 0x9086b48
  ls->readdir64(0x907eb18)                                                 = 0x907eb9c
  ls->readdir64(0x907eb18)                                                 = 0x907ebb4
  ls->malloc(5)                                                            = 0x9086b68
  ls->readdir64(0x907eb18)                                                 = 0x907ebcc
  ls->malloc(9)                                                            = 0x9086b78
  ls->readdir64(0x907eb18)                                                 = 0
  ls->closedir(0x907eb18)                                                  = 0
  ls->free(0)                                                              = <void>
  ls->malloc(48)                                                           = 0x907eb18
  ls->_setjmp(0x80633e0, 0xb775a500, 0, 0xbf983078)                        = 0
  ls->__errno_location()                                                   = 0xb75126c4
  ls->strcoll("test", "main.cpp")                                          = 7
  ls->__errno_location()                                                   = 0xb75126c4
  ls->strcoll("Makefile", "start_test_tcmalloc.sh")                        = -6
  ls->__errno_location()                                                   = 0xb75126c4
  ls->strcoll("Makefile", "main.cpp")                                      = 2
  ls->__errno_location()                                                   = 0xb75126c4
  ls->strcoll("Makefile", "test")                                          = -7
  ls->__errno_location()                                                   = 0xb75126c4
  ls->strcoll("start_test_tcmalloc.sh", "test")                            = -1
  ls->realloc(0, 96)                                                       = 0x907eb50
  ls->malloc(144)                                                          = 0x907ebb8
  ls->__errno_location()                                                   = 0xb75126c4
  ls->__ctype_get_mb_cur_max()                                             = 6
  ls->__ctype_get_mb_cur_max()                                             = 6
  ls->__errno_location()                                                   = 0xb75126c4
  ls->__ctype_get_mb_cur_max()                                             = 6
  ls->__ctype_get_mb_cur_max()                                             = 6
  ls->__errno_location()                                                   = 0xb75126c4
  ls->__ctype_get_mb_cur_max()                                             = 6
  ls->__ctype_get_mb_cur_max()                                             = 6
  ls->__errno_location()                                                   = 0xb75126c4
  ls->__ctype_get_mb_cur_max()                                             = 6
  ls->__ctype_get_mb_cur_max()                                             = 6
  ls->__errno_location()                                                   = 0xb75126c4
  ls->__ctype_get_mb_cur_max()                                             = 6
  ls->__ctype_get_mb_cur_max()                                             = 6
  ls->__errno_location()                                                   = 0xb75126c4
  ls->__ctype_get_mb_cur_max()                                             = 6
  ls->__ctype_get_mb_cur_max()                                             = 6
  ls->fwrite_unlocked("main.cpp", 1, 8, 0xb7708ac0)                        = 8
  ls->__overflow(0xb7708ac0, 32, 3, 4)                                     = 32
  ls->__overflow(0xb7708ac0, 32, 3, 4)                                     = 32
  ls->__errno_location()                                                   = 0xb75126c4
  ls->__ctype_get_mb_cur_max()                                             = 6
  ls->__ctype_get_mb_cur_max()                                             = 6
  ls->__errno_location()                                                   = 0xb75126c4
  ls->__ctype_get_mb_cur_max()                                             = 6
  ls->__ctype_get_mb_cur_max()                                             = 6
  ls->fwrite_unlocked("Makefile", 1, 8, 0xb7708ac0)                        = 8
  ls->__overflow(0xb7708ac0, 32, 3, 4)                                     = 32
  ls->__overflow(0xb7708ac0, 32, 3, 4)                                     = 32
  ls->__errno_location()                                                   = 0xb75126c4
  ls->__ctype_get_mb_cur_max()                                             = 6
  ls->__ctype_get_mb_cur_max()                                             = 6
  ls->__errno_location()                                                   = 0xb75126c4
  ls->__ctype_get_mb_cur_max()                                             = 6
  ls->__ctype_get_mb_cur_max()                                             = 6
  ls->fwrite_unlocked("start_test_tcmalloc.sh", 1, 22, 0xb7708ac0)         = 22
  ls->__overflow(0xb7708ac0, 32, 3, 4)                                     = 32
  ls->__overflow(0xb7708ac0, 32, 3, 4)                                     = 32
  ls->__errno_location()                                                   = 0xb75126c4
  ls->__ctype_get_mb_cur_max()                                             = 6
  ls->__ctype_get_mb_cur_max()                                             = 6
  ls->__errno_location()                                                   = 0xb75126c4
  ls->__ctype_get_mb_cur_max()                                             = 6
  ls->__ctype_get_mb_cur_max()                                             = 6
  ls->fwrite_unlocked("test", 1, 4, 0xb7708ac0)                            = 4
  ls->__overflow(0xb7708ac0, 10, 2, 0x907eb20main.cpp  Makefile  start_test_tcmalloc.sh  test
)                             = 10
  ls->free(0x907eb08)                                                      = <void>
  ls->free(0)                                                              = <void>
  ls->free(0x907eaf0)                                                      = <void>
  ls->exit(0 <unfinished ...>
    ls->__fpending(0xb7708ac0, 0xb775a500, 0xb770842c, 0xb7757cb0)         = 0
    ls->fileno(0xb7708ac0)                                                 = 1
    ls->__freading(0xb7708ac0, 0xb775a500, 0, 0xb75c66a0)                  = 0
    ls->__freading(0xb7708ac0, 0xb775a500, 0xb7708ac0, 0xb75c65c0)         = 0
    ls->fflush(0xb7708ac0)                                                 = 0
    ls->fclose(0xb7708ac0)                                                 = 0
    ls->__fpending(0xb7708960, 0xb775a500, 0xb770842c, 0xb7757cb0)         = 0
    ls->fileno(0xb7708960)                                                 = 2
    ls->__freading(0xb7708960, 0xb775a500, 0, 0)                           = 0
    ls->__freading(0xb7708960, 0, 0xb7512780, 0xb75c0f79)                  = 0
    ls->fflush(0xb7708960)                                                 = 0
    ls->fclose(0xb7708960)                                                 = 0
    libselinux.so.1->free(0)                                               = <void>
    libselinux.so.1->free(0)                                               = <void>
    libselinux.so.1->free(0)                                               = <void>
    libselinux.so.1->free(0)                                               = <void>
    libselinux.so.1->free(0)                                               = <void>
    libselinux.so.1->free(0)                                               = <void>
    libselinux.so.1->free(0)                                               = <void>
    libselinux.so.1->free(0)                                               = <void>
    libselinux.so.1->free(0)                                               = <void>
    libselinux.so.1->free(0)                                               = <void>
    libselinux.so.1->free(0)                                               = <void>
    libselinux.so.1->free(0)                                               = <void>
    libselinux.so.1->free(0)                                               = <void>
    libselinux.so.1->free(0)                                               = <void>
    libselinux.so.1->free(0)                                               = <void>
    libselinux.so.1->free(0)                                               = <void>
    libselinux.so.1->free(0)                                               = <void>
    libselinux.so.1->free(0)                                               = <void>
    libselinux.so.1->free(0)                                               = <void>
    libselinux.so.1->free(0)                                               = <void>
    libselinux.so.1->free(0)                                               = <void>
    libselinux.so.1->free(0)                                               = <void>
    libselinux.so.1->free(0)                                               = <void>
    libselinux.so.1->free(0)                                               = <void>
    libselinux.so.1->free(0)                                               = <void>
    libselinux.so.1->free(0)                                               = <void>
    libselinux.so.1->free(0)                                               = <void>
    libselinux.so.1->free(0)                                               = <void>
    libselinux.so.1->free(0)                                               = <void>
    libselinux.so.1->free(0)                                               = <void>
    libselinux.so.1->free(0)                                               = <void>
    libselinux.so.1->free(0)                                               = <void>
    libselinux.so.1->__cxa_finalize(0xb77371d4, 4096, 0xb7644bc6, 0xb771a728) = 0xb77093f8
    libacl.so.1->__cxa_finalize(0xb77150c0, 4096, 0xb7644bc6, 0xb772dabd)  = 0xb77093f8
  评论这张
 
阅读(443)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017