strace是一个在类Unix操作系统如Linux上做debugging和trouble shooting的超级好用的工具。它可以捕获和记录进程的所有系统调用,以及这个进程接收的所有信号。
原文: 10 Strace Commands for Troubleshooting and Debugging Linux Processes
strace是一个在类Unix操作系统如Linux上做debugging和trouble shooting的超级好用的工具。它可以捕获和记录进程的所有系统调用,以及这个进程接收的所有信号。
原文: 10 Strace Commands for Troubleshooting and Debugging Linux Processes
以一台Linux服务器为例。这台Linux包括两颗Intel(R) Xeon(R) CPU E5-2630 v4 @ 2.20GHz CPU, 单颗CPU包括 10 个 cpu core, 使用超线程包含20个逻辑cpu core, 具体的官方介绍: E5-2630 V4。
下面让我们通过Linux的命令来查找对应的参数,看看是否符合官方的介绍, 主要是查看/proc/cpuinfo的信息获得。
如果你用SS FQ的话, Shadow-Socks设置的系统代理是socks5代理,在iTerm中访问一些https还是不能用, 比如用go get下载一些依赖的库。一个办法就是使用Privoxy将socks5代理转换成http代理。
MacOS安装Privoxy比较简单。
1 | -> brew install privoxy |
你可以使用brew services start privoxy启动privoxy服务,或者手工临时启动privoxy /usr/local/etc/privoxy/config也可以。
如果中间需要brew link privoxy按照提示创建文件夹,比如/usr/local/sbin,设置对应的权限即可。
启动服务前先编辑vim /usr/local/etc/privoxy/config
1 | listen-address 127.0.0.1:8087 |
8087是本机要监听的http代理地址, 1080是SS的socks5代理地址,还设置本地地址。
通过下面的环境变量就可以设置http代理。
1 | export http_proxy=http://127.0.0.1:8087 |
你可以把它们写在 ~/.zshrc 或者 ~/.bash_profile中,随时切换。
1 | alias goproxy='export http_proxy=http://127.0.0.1:8087 https_proxy=http://127.0.0.1:8087' |
参考
最近在做Docker镜像的时候发现镜像文件非常大,需要找出程序的依赖库,减少程序的大小,所以整理了一下相关的工具。基本上这些工具都在GNU Binutils中。
GNU Binary Utilities或binutils是一整套的编程语言工具程序,用来处理许多格式的目标文件。当前的版本原本由在Cygnus Solutions的程序员以Binary File Descriptor library(libbfd)所撰写。这个工具程序通常搭配GCC、make、和GDB这些程序来使用。
它包含20个左右的工具,本文介绍了我在创建Docker镜像的时候的使用的几种工具。
ldd不是GNU Binutils工具集中的一个工具,但是却是一个非常有用的工具, 它可以显示程序或者共享库所需的共享库。
例如:
1 | # ldd main |
依照ldd得手册, 有时候ldd会通过执行程序来获取依赖信息,对于来源不明的程序,执行这些程序可能会带来风险,所以对于来源不明的程序,可以使用objdump来分析。
onjdump可以显示目标文件的信息,可以通过参数控制要显示的内容。
比如-p可以显示文件头内容, 通过grep可以查看依赖的库。
1 | # objdump -p main|grep GLIBC |
甚至可以查看-T可以查看动态符号表的内容:
1 | # objdump -T main|grep GLIBC |
nm显示目标文件的符号。
1 | # nm go/bin/glide |more |
strings显示文件中的可打印字符。
1 | # strings main|grep GLIBC |
通过上面的工具,可以分析出文件的依赖库,创建Docker镜像的时候只需把所需的依赖库加进去即可。
如果程序本身比较大,可以将程序压缩,去掉不需要的一些数据, 比如使用strip进行裁剪。
你可以通过参数控制要丢掉的哪些符号。
比如去除符号表和行号信息:
1 | strip main |
Linux下的GNU Libtool是一种属于GNU建构系统的GNU程序设计工具,用来产生便携式的库。这里引用libtool手册的说明:
1 | libtool --mode=compile gcc -g -O -c foo.c |
MacOS下的libtool时另外一个工具,可以用来创建库:
1 | libtool -dynamic -o c.dylib a.o b.o |
可以对静态库做创建、修改和提取的操作。
1 | ar rv libNAME.a file1.o file2.o |
比nm更强大,mac还有一个对应的图形化工具——MachOView。
查看依赖动态库:
1 | otool -L a.out |
查看反汇编代码段:
1 | otool -v -t a.out |
最近需要将一个项目的master分支用另一个分支完全替换, 查找了相关资料,最后追溯到stackoverflow上的一个提问: How to replace master branch in git, entirely, from another branch?。
网友给出了两种方案。
假设需要将seotweaks分支替换成master。
1、
1 | git checkout seotweaks |
-s ours是--strategy=ours的简写。
2、
如果上面的操作有问题, 还可以使用下面这个方法:
1 | git branch -m master old-master |
-m用来重命名分支。
This might remove commits in origin master。
备用,不解释
1、 首先安装 polipo, 设置parent proxy to Ss:
1 | apt-get install polipo |
macosx运行
1 | brew install polipo |
设置全局http proxy:
1 | http_proxy=http://localhost:8123 apt-get update |
对于git:
1 | git config --global http.proxy 127.0.0.1:8123 |
1 | $ rm -rf ~/.glide |
Mac OSX中虽然带了 netstat工具,可是用起来不像Linux下那么爽, 一个是慢 (netstat -p tcp | grep $PORT),二是不能pid,所以stackoverflow上建议使用lsof工具。
所以你可以使用下面的命令:
1 | lsof -n -i4TCP:$PORT | grep LISTEN # Verified on macOS Sierra |
为了不显示端口的俗称,你可以加P参数:
1 | lsof -nP -i4TCP:$PORT | grep LISTEN # Verified on macOS Sierra |
如果不想grep Listen,可以加-sTCP:LISTEN。
没有更多要说的了,谨记一下备用。