Quantcast
Channel: Dutor
Browsing latest articles
Browse All 36 View Live

获取POSIX线程真实PID/TID

...

View Article



一个管理ssh的脚本

  Windows下面的有几个比较好的虚拟终端,比如对个人免费的XShell和收费的SecureCRT,如果平时有很多机器需要ssh远程操作,使用这些工具是很方便的(Putty很小巧,但功能相对较若)。但Linux平台下,我没找到类似的工具。虽说有原生的ssh命令,但如果有大量的主机需要登录,还是有些捉襟见肘。然后,脚本就又来拯救世界了。   脚本很简单, 1 2 3 4 5 6 7 8 9 10...

View Article

链接器做什么

  前几天,在组内分享了关于链接器的一些东西,在这里总结一下。讨论的背景主要是基于C/C++,Linux平台相关。 链接器相关的一些基本问题   学习或者了解链接器,有一些基本的问题需要关心:链接器做些什么;链接器和体系结构;程序是怎样生成的。下面做简要介绍。 链接器做些什么...

View Article

lsof命令

  lsof, LiSt Opened Files, 列出打开的文件, 听起来很简单的样子. 但想*nix中很多其他工具一样, lsof把这件简单的事情做到了炉火纯青. 因为Unix认为”一切皆文件”, 那么”打开的文件”就不仅仅是传统意义上打开的文件了, 还可以是网络/Unix域套接字, 匿名/具名管道, 共享库文件, 目录文件, 设备文件等等. 很多场景下,...

View Article

g++优化触发的bug一枚

  本菜鸟写了一个server,经长时间激烈的测试以后,终于要在测试环境供外部使用了。经过一天激烈的打包,一枚rpm终于诞生了。上传到公司的yum包仓库,当PE同学部署时遇到了问题。程序在启动过程中莫名地core掉了,屡试不爽。使用gdb查看core文件的程序堆栈,发现程序core在了一个我从来没有修改过的类的析构函数中,core的直接原因就是C/C++程序员的老朋友Segmentation...

View Article


迭代中释放hash_map key的内存

  这么一段程序, 1 2 3 4 5 6 7 8 9 typedef __gnu_cxx::hash_map<object *, object *, object_equal_to, object_hasher> object_hash_map_t; object_hash_map_t hash_map; hash_map.insert(make_pair(new object,...

View Article

pure virtual method called

看下面程序有什么问题? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 class X { public: X() { h(); } virtual ~X() {} virtual void f() = 0; void h(); }; void X::h() { f(); } void X::f() { }...

View Article

多进程使用pthread mutex

  pthread的mutex通常用在多线程的同步当中,至于多进程的同步,一直以为只能使用记录锁和信号量,而这两种机制都需要内核的支持,属于“重量级”部件。也曾经在多进程同步中使用pthread...

View Article


GCC strict aliasing

  事情是这样的。我们对tair(淘宝的分布式Key/Value系统)动了一次大手术,更换了网络框架,经过长时间的测试/调试,终于完全通过了回归测试。但要打包发布的时候,却发现服务器可以正常启动,但却完全无法接受请求。调试无果,对比打包前后程序的差异,仅在于是否使用-O2选项对程序进行编译优化。   无头苍蝇一样,Google搜索“gcc optimization...

View Article


创建可执行的共享库

  偶然发现glibc提供的libc.so是“可执行的”,这是快速查看glibc版本的一种方法, 1 2 3 4 5 6 7 ~$ /lib/i386-linux-gnu/libc.so.6 GNU C Library (Ubuntu EGLIBC 2.13-20ubuntu5.1) stable release version 2.13, by Roland McGrath et al....

View Article

mincore

  经常需要查看一个文件有多少页面驻留在物理内存中,Linux中没有找到现成的命令,自己动手写了个小工具,基于mincore(2)系统调用。代码放在Github上面,可以git clone git://github.com/dutor/mincore.git获取。...

View Article

A False-Sharing Test

  今天通过酷壳一篇推荐了解了一下 Cache 的“伪共享”(False Sharing). 写了小程序做了个简单的测试: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49...

View Article

A Memory-Reording Test

  最近看了些Memory Barrier的东西,针对一个经典的示例程序,做了重现性测试。   对这个程序原型做一个简要介绍:有全局变量x/y/r1/r2,初始值均为0;线程1执行x = 1; r1 = y; 线程2执行y = 1; r2 = x。从“程序员角度”,在两个序列执行过后,r1 == r2 ==...

View Article


给线程命名

  多线程程序中,默认情况下各个线程的名字与进程名相同,但是可以通过操作系统提供的接口(prctl)修改这个名字。方法很简单,但某些时候,可以给程序的调试和运维带来很大的帮助。   最近在调优tair的proxy server,其中使用到了tair client,每个tair client会创建若干个线程用于网络IO,另外proxy...

View Article

g++ 函数域静态变量的初始化

  不必说静态变量和普通变量的区别,也不必说静态变量及其作用域的得与失,单单说一下函数作用域的静态变量是如何初始化的。 1 2 3 4 5 6 int foo() { static int n = init(); //~ do anything/nothing on 'n' return n; }   在 foo() 第一次被调用时,foo()::s 只初始化一次(C...

View Article


GDB 『高级』命令

set follow-fork-mode child,被调试进程执行 fork 时,自动 attach; set scheduler-locking on,调试时,禁用线程切换,可选 on/off/step,默认 off; symbol-file target.debug,添加独立的 debuginfo 文件; i sharedlibrary,查看共享文件映射信息; add-symbol-file...

View Article

记一次栈缓冲区溢出的调试

  没几天,你的程序出炉了,加以时日,回归测试也完成了,你兴冲冲地想,啊哈,终于可以上线给东家挣钱啦!   有一天,你的程序 core dump 了,光荣地被谋杀在战场的某个小小小角落。你战战兢兢地打开了 GDB,妄图勘察现场,习惯性地按下 bt,看到了下面的一幕: #0 0x0000000000000078 in ?? () #1 0x000014473a087d0a in ?? () #2...

View Article


accept『死循环』

  场景:一个多线程服务器,每个线程执行一个事件循环。在事件循环开始前,调用 socket/bind/listen 监听端口,然后将监听句柄(fd)添加到 epoll,然后开始事件循环,执行 epoll_wait。epoll_wait 返回有效事件时,对于监听事件,调用 accept 建立新连接,将该连接句柄添加到 epoll;对于普通连接,调用 read/write 进行网络 IO...

View Article

[TCMalloc] 全局内存分配器

  TCMalloc 的全局分配器,处于 TCMalloc 的最底层,负责向操作系统申请和释放内存,接口有两个,定义在 src/system-alloc.h|.cc: 1 2 3 extern void* TCMalloc_SystemAlloc(size_t bytes, size_t *actual_bytes, size_t alignment = 0); extern bool...

View Article

[TCMalloc] PageHeap 页面管理

  上一篇介绍了 TCMalloc 的 SysAllocator,处于最底层,该层负责直接和内核交互,申请和释放内存。紧邻 SysAllocator 的上一层,是 PageHeap,负责管理内存页面。   TCMalloc 中的页面和 Linux 内核中的页面相似,事实上,组织方式也和内核接近。介绍 PageHeap 之前,先要介绍 Span,一个 Span 是一个或多个 Page,也是...

View Article

原子,锁,还有内存屏障

原子   “在古希腊文中,原子就是不可再分的含义“。在程序设计的内涵下,『原子』性表示一个操作的中间状态对外的不可见性,体现在内存修改的中间状态不可见,体现在 CPU 指令的不可中断。原子操作是并发环境的基础,是互斥锁实现的必要条件。这里说的并发环境,是指多个执行序列,共享了某些状态,运行在单个或多个 CPU...

View Article


并发引起的诡异 Bug 一枚

  Tair 又 core dump 了。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 Core was generated by `sbin/tair_server -f etc/dataserver.conf'. Program terminated with...

View Article


[C++] 右值引用:移动语义与完美转发

  C++11 引入的新特性中,除了并发内存模型和相关设施,这些高帅富之外,最引人入胜且接地气的特性就要属『右值引用』了(rvalue reference)。加入右值引用的动机在于效率:减少不必要的资源拷贝。考虑下面的程序: 1 2 std::vector<string> v; v.push_back("string");   向 vector 中添加一个元素,这个动作需要先后调用...

View Article

[C++] 变参模板

  上文书介绍了 C++11 中的右值引用及其应用:移动语义和完美转发。本文介绍另外一个应用广泛的特性,变参模板。变参模板允许模板使用个数可变的参数类型来声明模板,包括类模板和函数模板。变参模板的基本语法是这样的: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 void print() { cout<<endl; }   template...

View Article

AT&T 汇编和 GCC 内联汇编简介

  对一个应用程序员来讲,了解汇编不是必需的,更少有手写纯汇编的需求。但是如果能了解些基本的汇编知识,对程序调试和一些语言特性的理解是大有裨益的。本文介绍 AT&T 语法的汇编的要点以及 GCC 使用的内联汇编(inline assembly)的使用。 AT&T 汇编   AT&T 汇编是 GCC 所采用的语法,要点: 寄存器名以 ‘%’ 为前缀:%eax; 立即数以 ‘$’...

View Article

Browsing latest articles
Browse All 36 View Live




Latest Images