
程序调试
文章平均质量分 58
cjfeii
Hello World.
展开
-
sysbench代码剖析和实践
sysbench是一款比较流行的测试工具,主要用于测试fileio、cpu、memory、threads、mutex等的性能测试,但是最主要的还是做数据库的性能测试,经常用来测试MySQL、Drizzle、AttachSQL、Oracle、PostgreSQL等相关的数据库,也可以扩展支持其他的数据库以及测试用例,本文主要介绍sysbench的代码逻辑、代码调试、lua脚本以及相关扩展功能。本文的介绍主要基于sysbench 1.0的代码:repo:https://github.com/akopyto原创 2021-10-13 20:55:51 · 1651 阅读 · 0 评论 -
使用systemtap模拟磁盘IO故障
真实场景下,磁盘故障时有发生,如何模拟原创 2021-09-26 21:08:45 · 1913 阅读 · 0 评论 -
使用systemtap模拟网络延迟
上文介绍了IO延迟的注入,本文主要介绍网络的延迟注入,其实网络的延迟模拟工具有很多,我们可以通过tc、iptables等常用工具来做,这些工具都很好用,但是如果精细到系统调用级别的延迟注入,上述常规的工具可能就不太容易实现了,这正是stap擅长的领域。下面就是一个在服务端建立连接后延迟3秒返回的stap脚本:#!/usr/bin/stap# file: sock_connect_delay.stp# cmd: sudo stap ./sock_connect_delay.stp -g# 在建连原创 2021-09-26 20:43:13 · 817 阅读 · 0 评论 -
使用systemtap模拟磁盘IO延时
在分布式存储系统的异常测试中,模拟硬件故障是一个比较头痛的问题。比较幸运的是,Linux环境下有一个非常好的工具SystemTap(https://sourceware.org/systemtap/),可以使用stap给系统调用增加勾子,并注入我们期望的异常,达到验证应用程序在异常情况的行为是否符合预期的目的。注意:stap会影响系统调用的行为,为了限制影响面,建议做好filter(可以通过pid、devname等条件限制),否则会严重影响系统稳定性,不建议在生产环境使用。生产环境经常因为IO抖动,原创 2021-09-26 20:31:36 · 2210 阅读 · 0 评论 -
gcc之__attribute__字节对齐参数设置
在性能要求比较高的场景下,经常会用到字节对齐,我们可以通过gcc的__attribute__来设置struct的字节对齐,比较常用的就是aligned和packet,本文主要介绍这两种设置字节对齐的用法。1. aligned - 设置变量对齐aligned的功能就是设置变量按照指定的字节进行内存对齐,对齐的字节数必须是2的指数,再看一个使用的例子:// file: test.c// gcc test.c -o test#include <stdint.h>#include <s原创 2021-09-26 18:12:31 · 3035 阅读 · 0 评论 -
网络故障模拟工具
在做异常测试时需要模拟网络异常,经常使用的模拟工具有tc和iptables。1. tctc(traffic control)一般用来做精细的网络故障模拟。模拟网络延迟:# 1. 将 eth0 网卡的传输设置为延迟 100 毫秒发送:**# tc qdisc add dev eth0 root netem delay 100ms## 2. 将 eth0 网卡的传输设置为延迟 100ms ± 10ms (90 ~ 110 ms 之间的任意值)发送# tc qdisc add dev eth0 r原创 2021-04-08 11:28:34 · 1457 阅读 · 0 评论 -
socket的O_NONBLOCK以及TCP_NODELAY
设置socket的O_NONBLOCK以及TCP_NODELAY1. no-blocking将socket设置为no-blocking意味着socket收发数据都是非阻塞的,相比于阻塞方式,需要特殊处理这个错误码:EWOULDBLOCK or EAGAIN(这两个错误码是一样的,都是35),进行重试或者重新调度。将socket设置非阻塞有多种方法,下面会一一汇总。1.1 fcntl设置O_NONBLOCKPOSIX的fcntl用的比较广泛,兼容性也比较好,优先推荐使用fcntl来设置,缺点是需要两原创 2021-04-07 14:19:15 · 6716 阅读 · 0 评论 -
在c++中实现一个good spinlock
在c++中实现一个good spinlock网上有很多关于spinlock不好的实现。他们都犯了相同的错误:在RMW(read-modify-write)操作上自旋。我后面会说明为什么这些实现不好,也会介绍如何在C++中实现一个好的spinlock,并且这个实现很容易迁移到其他编程语言中。在本文的最后提供了完整的spinlock实现。一个bad spinlock实现最基本的自旋锁使用一个boolean值(或1个bit)来表示锁是否被持有。要获取锁,使用原子交换操作将boolean值设置为true。翻译 2021-03-30 17:45:15 · 2263 阅读 · 1 评论 -
double free or corruption错误定位
“double free or corruption”错误定位1. 测试程序先写一个简单的测试程序模拟double free错误:// file: t.c#include <stdlib.h>void *func1(size_t size) { return malloc(size);}void func2(void *p) { free(p);}int main() { char *ptr = func1(sizeof(char));原创 2021-03-17 12:36:30 · 15442 阅读 · 1 评论 -
brpc线程模型和网络模型
brpc线程模型和网络模型1. 简单介绍本文主要介绍brpc的线程模型,以及网络请求处理的整个流程。1.1 brpc线程模型简介bthread是brpc使用的M:N线程库,目的是在提高程序的并发度的同时,降低编码难度,并在核数日益增多的CPU上提供更好的scalability和cache locality。”M:N“是指M个bthread会映射至N个pthread,一般M远大于N。由于linux当下的pthread实现(NPTL)是1:1的,M个bthread也相当于映射至N个LWP。bthre原创 2021-03-12 18:16:27 · 6697 阅读 · 0 评论 -
通过火焰图查看调用栈
1. 将火焰图的项目clone下来# git clone https://github.com/brendangregg/FlameGraph.git2. 采集数据:# sudo perf record -F 99 -p $PID -g -- sleep 303. 查看每个调用栈的百分比# perf report -n --stdio4. 生成火焰图# perf script -i perf.data &> perf.unfold# ./stackcollapse-per原创 2021-03-10 16:46:36 · 444 阅读 · 0 评论 -
使用perf分析网络系统调用栈
使用perf分析网络系统调用栈1. 增加事件比如增加了如下网络通信相关的系统调用:# perf probe --add sys_writev='sys_writev'# perf probe --add sys_writev_exit='sys_writev%return'# perf probe --add vfs_writev_exit='vfs_writev%return'# perf probe --add do_readv_writev_exit='do_readv_writev%re原创 2021-03-10 16:30:56 · 2444 阅读 · 0 评论 -
netty系列3-Java BIO编程
网络模型基本的模型是client/server模型,client进程和server进行通信,server端做绑定IP,并绑定端口;client端向服务端监听的地址发起连接请求,通过三次握手建立连接。如果建立成功,双方就可以通过socket进行通信。原创 2017-11-10 10:17:33 · 370 阅读 · 0 评论 -
Nginx range过滤器整形溢出漏洞 (CVE–2017–7529)预警分析
Nginx range过滤器整形溢出漏洞 (CVE–2017–7529)预警分析:当使用nginx标准模块时,这允许攻击者如果从缓存返回响应,则获取缓存文件头,黑客可以通过缓存文件头获取包含IP地址的后端服务器或其他敏感信息,从而导致信息泄露。原创 2017-07-28 19:04:25 · 5809 阅读 · 0 评论 -
redis性能分析工具redis-faina
redis性能分析工具redis-fainaredis-faina是一个通过解析redis的MONITOR命令,从而对redis实例进行性能诊断的工具。 该工具使用虽然简单,但是功能还是很不错,对于定位线上redis性能问题,确实是一把利器。原创 2017-08-10 18:30:14 · 6269 阅读 · 0 评论 -
openresty-lua代码的语法检查
lua 代码的语法检查可以如下命令:$ luajit -bl foo.lua > /dev/nullref: https://github.com/openresty/lua-nginx-module/issues/436原创 2016-07-21 15:08:38 · 3187 阅读 · 0 评论 -
centos7 systemtap 介绍
systemtap原创 2016-05-27 17:26:19 · 2272 阅读 · 0 评论 -
gdb 正常情况下生成 core dump 文件
$ gdb -p 19553(gdb) gcorewarning: target file /proc/19553/cmdline contained unexpected null charactersSaved corefile core.19553(gdb) detach Detaching from program: /usr/sbin/mysqld, process 19553原创 2016-03-08 09:23:34 · 1864 阅读 · 0 评论 -
GDB调试core文件
1. 什么是core dump?core dump说的是操作系统执行的一个动作,当某个进程因为一些原因意外终止(crash)的时候,操作系统会将这个进程当时的内存信息转储(dump)到磁盘上,产生的文件就是core文件了,一般会以core.xxx形式命名。2. 那些信号能够引起core dump?经常用到的主要有这几种:SIGSEGV 建立CORE文件 段非法错误原创 2013-07-17 21:27:04 · 6929 阅读 · 0 评论 -
一个和const有关的编译错误
最近编写程序出现了这个错误,很简单的一个程序,在此mark一下。下面是编译报错程序://test.cpp#include #include using namespace std;class Test{ public: string &getValue(const int _key) const; // other fu原创 2013-07-16 19:18:23 · 4349 阅读 · 0 评论 -
lua 中随机种子的设定
该文主要介绍 lua 中设置随机种子的方法,这些方法也可用到其他的编程语言中。原创 2015-01-15 09:20:41 · 10893 阅读 · 2 评论 -
c/c++ 中的volatile分析
volatile 具有下面的特点:1.易变的;2.不可优化的;3.顺序性; 1) volatile变量之间能保证顺序性(编译时); 2) volatile变量之间可能会出现乱序;但是,执行时是否顺序执行,这要依赖于CPU内存模型;原创 2014-07-25 11:06:42 · 676 阅读 · 0 评论 -
GDB一些命令的简单介绍
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。1. 主要功能:启动你的程序,可以按照你的自定义的要求随心所欲的运行程序;可让被调试的程序在你所指定的调置的断点处停住;当程序被停住时,可以检查此时你的程序中所发生的事;动态的改变你程序的执行环境;更详细的大家可以百度、谷歌一下2. 我们先讲一下gdb的暂停机制:跟断点相关的point主要有三种:原创 2013-07-17 21:22:36 · 1311 阅读 · 0 评论 -
常用的 tcpdump 命令参考手册
这里汇总了常用的 tcpdump 命令。原创 2015-09-19 18:25:10 · 3456 阅读 · 0 评论 -
rsync 简述
是一个远程数据同步工具,可用LAN/WLAN快速同步多台主机的文件。rsync核心算法见:rsync 的核心算法 (http://coolshell.cn/articles/7425.html#jtss-tsina)用法: rsync [OPTION]... SRC DEST rsync [OPTION]... SRC [USER@]HOST:DEST rsync [原创 2014-08-19 11:41:20 · 782 阅读 · 0 评论 -
lua 和 C 语言进行交互 —— 如何传递table
方法1:采用 lua_pushstring/lua_pushnumber 传递key、value,然后通过 lua_settable 设置 table 中的kv对,like this: lua_pushnumber(L, 1); lua_pushstring(L, "value1"); lua_settable(L, -3);原创 2014-05-12 09:55:02 · 17656 阅读 · 0 评论 -
将ffmpeg改造成一个可以链接的library
一、事件起因:最近有个项目,需要搞音频格式转换,需要满足一下功能:1. amr wav2. amr mp33. 已接口加动态库的形式提供上面1和2的功能在网上搜索了很久,没有找到合适的library。在找的过程中发现ffmpeg能实现1和2的功能,但是它不满足3的功能,所以有了将ffmpeg改造成library。二、改造的步骤:1. 提取必要的参原创 2014-04-24 12:21:22 · 1776 阅读 · 0 评论 -
gdb不停收到sigtrap信号
在用gdb调试程序的时候出现这样一种错误:Program received signal SIGTRAP, Trace/breakpoint trap.在网上查到解决方案了,在这mark一下,以后有时间好好研究。找到解决问题的办法了在kernel mode改写了watchpoint的值以后,cpu把eflags的TF位置1了,照理说gdb应该清0这一位,但由于未知原因,gdb没清0该原创 2014-03-20 21:33:28 · 34745 阅读 · 0 评论 -
64位平台C/C++开发注意事项
上次在酷壳看到这篇博文,里面列出了很多好的文章,就想给它们翻译一下,所以转载了酷壳的这篇博文。转载至:http://coolshell.cn/articles/3512.html作者:陈皓在http://www.viva64.com/en/l/上例出了28个在64位平台上使用C/C++开发的注意事项,对于进入64位时代的程序员应该去看看这28个事项,这些英文读物对于有C/C++转载 2013-08-25 17:30:18 · 1796 阅读 · 0 评论 -
一个字母引发的编译血案
我的环境是Linux操作系统。在当前目录下有这样几个源文件:// dou.hint dou(int _data);// dou.cpp#ifdef DOU#include int dou(int _data){ return 2*_data;}#else#include #endif// main.cpp#include #include原创 2013-07-18 20:22:14 · 1084 阅读 · 0 评论 -
GDB调试多线程程序
info threads 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID。 前面有*的是当前调试的线程。thread ID切换当前调试的线程为指定ID的线程break thread_test.c:123 thread all在所有线程中相应的行上设置断点thread apply ID1 ID2 com原创 2013-07-17 21:29:00 · 8037 阅读 · 0 评论 -
Linux中使用ptrace获取pthread线程的寄存器信息
1.与本文相关的有这几个重要的函数:pthread_create:创建线程pthread_self:获取当前运行的线程的线程ID (The pthread_self() function returns the ID of the calling thread.)getpid:获取当前进程IDgettid:获取当前运行的线程的线程ID(gettid() returns the ca原创 2013-07-12 20:28:42 · 7278 阅读 · 6 评论 -
C中与时间有关的函数
ref:http://bbs.youkuaiyun.com/topics/300190357、mark一下。总是在这里问问题,帮大家搜集些资料:C语言时间函数应用摘要:本文从介绍基础概念入手,探讨了在C/C++中对日期和时间操作所用到的数据结构和函数,并对计时、时间的获取、时间的计算和显示格式等方面进行了阐述。本文还通过大量的实例向你展示了time.h头文件中声明的各种函数和数转载 2014-03-22 23:48:34 · 818 阅读 · 0 评论 -
利用dmesg和addr2line来重现bug
利用dmesg和addr2line来重现bug有些时候,我们的程序crash了,但是我们没有保存core dump信息,这时如果我们想要知道程序在哪个位置出错,就不是那么容易了。下面有一种方法,可以大致判断出程序出错的大致位置。1.用dmesg查找出错的代码段地址。命令格式:dmesg | grep program_name其中program_name是可执行文件,原创 2014-03-03 17:37:47 · 12480 阅读 · 2 评论 -
用gdb调试程序的子进程
follow-fork-mode follow-fork-mode的用法为:set follow-fork-mode [parent|child] parent: fork之后继续调试父进程,子进程不受影响。child: fork之后调试子进程,父进程不受影响。因此如果需要调试子进程,在启动gdb后:(gdb) set follow-fork-mode child原创 2014-03-20 21:09:46 · 20925 阅读 · 0 评论