程序调试和性能分析常用技巧

简介:

程序调试和性能分析常用技巧


程序调试和性能分析通常需要设计到多种工具,有时甚至需要跨越用户态和内核态。本文总结了在程序调试和性能分析过程中常碰到三个问题,既是为了方便自己后面温习,也是为了和碰到同样问题的朋友一起分享。


1.如何调试多线程的程序?


多线程程序运行的时候如果出现崩溃或者产生core的时候,最困难的是很难定位到底是哪个线程导致的问题。为此,可以利用gdb工具中的thread apply命令来指定在某个ID的线程上运行gdb命令,比如下面的命令就是在fuse进程的1至250号线程上运行bt命令,然后把所有线程的”bt”输出统一定位到fuse.bt文件当中去。参考下面的命令可以得到所有线程的用户态的堆栈

gdb -q --batch -ex "thread apply 1-250 bt" attach `pidof fuse` | tee /home/qsia/fuse.bt



2.如何在程序运行的过程中修改某个变量的值?

gdb的attach命令能够和正在运行的进程相关联,而''--ex”能够指定期望运行的gdb命令,再加上 表示屏蔽版本等信息的-q和表示批处理—batch的参数,就组成了能在程序运行时修改变量的参数组合。比如下面的命令,就在sksmon进程运行时,动态地修改了它的mask的值:

 sudo    gdb -q --batch --ex "set msk=0" attach `pidofsksmon`


如果这个命令和上面的thread apply命令相结合,我们就能写出模拟多线程运行多种中间状态的脚本,这样能够极大的方便调试。



3.如何查看多线程程序的所有内核堆栈?


有时,我们需要查看多线程的程序的所有内核态堆栈,这时我们就需要充分利用Linux系统/proc文件系统的特性,进入到/proc下对应进程相关线程的目录,读出各自的”stack”信息。


cd /proc/`pidof yourprgoram_name`;

for i in `find ./ -name "stack"`; do echo $i >> ~/proc_search.log; cat $i >> ~/proc_search.log; done



4.如何分析程序关键函数的性能?

分析程序性能的工具很多,包括opprofile/systemtap等。Opprofile能够从CPU芯片和内核级别,给出系统的性能统计和分析,包括耗费CPU周期、Cache命中率等;而systemtap类似于SUN引入的DTrace,能够通过符号表生成可自动加载的探测驱动,从而能够统计系统运行时间、在指定函数插入特定函数。

针对特定业务应用的开发,一般而言,systemtap足够胜任。


4.1 systemtap的安装 


For Fedora/Centos/Redhat:

yum install systemtap

yum install kernel-devel gcc make

Prepare kernel debug information:

yum install yum-utils

debuginfo-install kernel



For ubuntu,Do it all with apt-get:

apt-get install systemtap

apt-get install linux-headers-generic gcc make

Prepare kernel debug information:

apt-get install linux-image-debug-generic

ln -s /boot/vmlinux-debug-$(uname -r) \

/lib/modules/$(uname -r)/vmlinux



4.2检查sysstemtap是否安装成功

运行命令 stap -v -e 'probe vfs.read {printf("read performed\n"); exit()}'

如果输出正常就没有问题,否则安装还有问题。



4.3如何编写stap监控脚本

和DTrace类似,systemtap运行的时候也需要stap脚本,请参考http://sourceware.org/systemtap/, 里面有非常完整的介绍。示例代码如下:

# Show sockets setting options# Return enabled or disabled based on value of optvalfunction getstatus(optval){    if ( optval == 1 )        return "enabling"    else        return "disabling"}probe begin{        print ("\nChecking for apps setting socket options\n")}# Set a socket optionprobe tcp.setsockopt{    status = getstatus(user_int($optval))        printf ("  App '%s' (PID %d) is %s socket option %s... ", execname(), pid(), status, optstr)}# Check setting the socket option workedprobe tcp.setsockopt.return{    if ( ret == 0 )        printf ("success")    else        printf ("failed")    printf ("\n")}probe end{        print ("\nClosing down\n")}



















本文转自存储之厨51CTO博客,原文链接:http://blog.51cto.com/xiamachao/1832608 ,如需转载请自行联系原作者

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
2月前
|
缓存 Linux iOS开发
【C/C++ 集成内存调试、内存泄漏检测和性能分析的工具 Valgrind 】Linux 下 Valgrind 工具的全面使用指南
【C/C++ 集成内存调试、内存泄漏检测和性能分析的工具 Valgrind 】Linux 下 Valgrind 工具的全面使用指南
71 1
|
2月前
|
存储 算法 C++
程序性能分析
1. 什么是程序性能 程序性能指的是程序在执行过程中所消耗的时间和资源的多少。一个好的程序应该能够在较短的时间内完成所需的任务,并且尽可能地利用少量的资源。
25 3
|
4月前
|
搜索推荐 测试技术 开发工具
NumPy 秘籍中文第二版:七、性能分析和调试
NumPy 秘籍中文第二版:七、性能分析和调试
38 0
|
5月前
|
机器学习/深度学习 图计算 异构计算
|
8月前
|
Linux 调度
Linux系统调试篇——Perf性能分析指南
Linux系统调试篇——Perf性能分析指南
|
10月前
|
监控 Java Linux
Java程序性能分析:内存
开发Java项目过程中,难免会碰到一些 性能 问题,这时候就需要一些工具,帮忙排查。本文主要介绍 JDK自带的上古神器 jstat、jmap,另简单介绍 MAT、gceasy、HeapDump 等
910 5
|
存储 算法 编译器
【代码随想录】第2章:程序的性能分析
【代码随想录】第2章:程序的性能分析
|
监控 Java 数据可视化
Java程序性能分析工具 VisualVM
引用:http://www.oschina.net/p/visualvm VisualVM是一个集成多个JDK命令行工具的可视化工具。可以作为Java应用程序性能分析和运行监控的工具。开发人员可以利用它来监控、分析线程信息,浏览内存堆数据。
1216 0
|
搜索推荐 Java 测试技术
使用JDK自带的VisualVM进行Java程序的性能分析
使用JDK自带的VisualVM进行Java程序的性能分析
108 0
使用JDK自带的VisualVM进行Java程序的性能分析
|
搜索推荐 Java 测试技术
使用JDK自带的VisualVM进行Java程序的性能分析
使用JDK自带的VisualVM进行Java程序的性能分析
119 0