(译)Writing Bug Free C Code Chapter 2 Know Your Environment

##### 这已经不是翻译了,这就是笔记了。

##chapter 2: 了解你的工作环境 //blahblahblah(具体内容是了解你工作环境中的功能,特性) ​ 在你的工作范围内尽可能成为专家 接下来讨论所有工作环境中遇到的问题

###2.1 C语言 无论你用啥编译器你都得彻底了解C语言工作环境

#####2.1.1 数组操作符[] //blahblahblahblah具体内容是数组操作符的功能,和指针的关系,咱认为是个陋习但是掌握还是不难的,随便翻一本C语言书都有的 // K&R §A7.3.1

#####2.1.2 结构体指针操作符 -> // K&R §A7.3.3

#####2.1.3 编译警告等级调高 // 这里具体指vs编译器,涉及到gcc就是-Wall 不多言

#####2.1.4 编译时断言设计 ComplierAssert() ​ 能放在编译期检测出来的bug就不要放在运行时

#####2.1.5 变量声明 cdecl

#####2.1.6 typedef

#####2.1.7 命名空间

#####2.1.8 代码段变量 //与编译器实现有关,没什么意义。只是个访问权限的区别

#####2.1.9 相邻字符串

#####2.1.10 多参数…

#####2.1.11 函数调用约定

#####2.1.12 代码生成汇编 //以上两条都预编译器相关,基本没有用

#####2.1.13 悬挂else问题

#####2.1.14 strncpy 空间踩踏

#####2.1.15 switch中default写对 你拼错编译器会解析成labal //应该会有警告的,21世纪了朋友,这个应该是不对的 //这特么都什么经验

#####2.1.16 逻辑运算与短路原则

#####2.1.17 摩根定律 //数电中的布尔电路章节内容,基本功了。 以上就是复习了一下C语言

###2.2 c预处理器

#####2.2.1 宏以及宏可能遇到的问题 作用域以及原子性

#####2.2.2 写有作用域的宏 do {}while(0)

#####2.2.3 宏中的条件语句 为了避免悬挂else这种可能遇到的问题 直接匹配上就好了。

#define ODS(s) if (!bDebugging) {} else OutputDebugString(#s)

#####2.2.4 宏像语句一样正常的使用,用分号或者语句块结尾

#define WinAssert(exp) if (!(exp)) {AssertError;} else

#####2.2.5 循环宏 //不建议这么写,这样是上古语法了。LOOP()ENDLOOP太二了

#####2.2.6 数量宏 就是用宏把sizeof封装起来,经常在数组里见到

#define NUMSTATICELS(pArray) (sizeof(pArray)/sizeof(*pArray))

#####2.2.7 预处理运算符# 字符串化和拼接技术

#####2.2.8 字符匹配 和编译器实现有关。这都二十一世纪了,这段可以去掉了

#####2.2.9 预处理器命令操纵预处理命令 宏开关

#####以上也是C语言回顾 主要是一些奇技淫巧

###2.3 编程难题 主要是一些实现上的坑

#####2.3.1 2的平方 宏

#define ISPOWER2(x) (!((x)&((x)-1)))

位运算。见Hacker’s delight

#####2.3.2 整数运算快 这与浮点数的设计有关,可以见MIT公开课编程范式 C语言部分

#####2.3.3 交换两个数不用第三个变量 就是著名的坑跌异或异或异或。没有意义。会溢出(当然用三个变量也有溢出的可能)

#####2.3.4 异或抵消锯齿?没看懂这部分 http://www.duckware.com/bugfreec/chapter2.html#windows

#####2.3.5 ~0 可移植性强于0xffff

#####2.3.6 y = -x 问题 补码

#####2.3.7 1和2 的补码

Two’s complement negation as a macro

#define NEGATE(x) (((x)^~0)+1)

###2.4 总结 个人总结 注意多参数的问题,快忘没了 宏的几个trick 还有2.3.4没看懂


Read More

debug hack读书笔记


非常粗糙


调试前的必知必会

  • coredump获取
    • ulimit -c确认是否开启 ulimit -c unlimited开启
    • gdb -c core_file bin_file
    • 指定目录生成core dump
    • coredump 过大导致磁盘压力 -> coredump_filter设置,排除共享内存
  • 基本的gdb命令,打断点看堆栈查变量看寄存器看汇编等等
    • gdb attach/查看历史值 show value
  • 初始化文件 .gdbinit 放在home下/也可以source
define li
  x/10i $pc
end
document li
  list machine instruction
end
断点
b core.h:41
b test.cpp:48 if(aiTest == 18 && biTest == 19)
条件断点,if (xxx),其中 if 与(最好有空格)
b 'helloworld::hellofunction' 对函数进行设定地址
b 0x222222243 对指令地址进行设断点

断点操作
info b
del 1/2/3

反汇编
disassemble
disassemble 'MyProcessor::ActijonHelper'
x /10i $pc 显示10条当前反汇编

变量
p infoPtr
p $rsi
p info
p &aiTest
p global::GetTest()
p /x (unsigned long long)0x7fffec8ed320 按16进制的ulong long查看0x7fffec8ed320内存里面的值

信息查看
info args
info registers
p $rsi

监视
rwatch (long long)0x7fffff22f 读
watch (long long)0x7fffff22f 写
awatch (long long)0x7fffff22f 读写
rwatch i if i == 5
watch (int)0x7fffff22f if (int)0x7fffff22f == 109999

栈帧
bt
bt full 3 全量
f 2
f 0

操作
s单指令
si 单指令入
n不进入
si 5 执行5次单指令
  • intel架构只是
    • 字节序
    • 寄存器
  • 堆栈与反汇编 disas
    • 参数传递
    • 简单看懂汇编
      • movl赋值 cmpl比较 调用call 循环 je addl 指针访问 *寄存器 水族movzbl
      • 用crash反汇编?

内核调试的准备

Oops

minicom ?

modprobe netconsole

diskdump?

kdump?

  • makedumpfile

crash命令

  • bt
  • dev
  • dis
  • files
  • irq
  • kmem
  • mod

特殊汇编

  • u2d 异常挂掉
  • sti/cli 禁止/允许中断

应用程序调试实践

SIGSEGV ->core文件

  • 地址重复多次,那就栈溢出
  • 捕获栈溢出需要使用备用栈

堆栈无法正确显示

  • 栈被破坏

    info reg
    x/i $rip
    

    返回地址被破坏,局部变量也有可能被破坏

数组非法访问导致内存破坏

  • 缓冲区溢出 Cannot access memory at address xx
  • 运行地址改变
    • 怀疑地址被写入字符串
    • 怀疑索引错误

malloc /free引入的错误

  • env MALLOC_CHECK_=1

无响应

  • ps状态 S
  • ll_lock_wait

内核停止响应

  • crash 看堆栈

系统负载高

  • oprofile

进阶工具

strace抓调用

objdump看汇编 addr2line

valgrind查泄漏

kprobes看内核 jprobes

systemtap调试 抓系统调用

/proc/meminfo

  • MemFree空闲内存总量

  • Buffers缓存总量

  • Cached页面缓存 不在Buffer和SwapCached中

  • SwapCache被换出的仍在交换区的页面大小

  • Active/Inactive LRU链表中的大小

  • Mapped映射到文件上的页面总大小

  • Slab 分配器内存使用量

  • PageTable 也秒使用内存

  • Commited_As提交内存/内存泄漏的大体数值估计点

/proc/<PID>/mem快速读取内容

OOM killer评分方法

  • /proc/<PID>/status VmSize
  • swapoff系统调用的进程分数被设置为最大值
  • 子进程加分
  • nice值低的
  • 超级进程重要,减分
  • capset设置过的减分
  • oom_adj调整分数

错误注入

failslab


Read More


如何判断平台是x86还是arm

case $(uname -m) in
    x86_64)  echo x86;;
    aarch64) echo arm;;
esac

又水一篇

ref

  • 上面的代码片改自这里 https://stackoverflow.com/questions/48678152/how-to-detect-386-amd64-arm-or-arm64-os-architecture-via-shell-bash
  • uname -m详细版本 https://stackoverflow.com/questions/45125516/possible-values-for-uname-m/45125525#45125525
  • uname -s检测系统是win还是mac linux写法类似。
  • uname 介绍https://gohom.win/2015/06/12/uname-shell/

contacts

Read More

使用perl模块 graph easy 画图

graph-easy

两种装法

  • 从命令行安装(我没有网,没试过)
cpan install Graph::Easy
或者
perl -MCPAN -e shell
install Graph::Easy
  • 编译源码 下载地址 解压进入目录下

    perl Makefile.PL make make test make install

graph-easy文件在bin目录下,拷贝到usr/bin或者使用路径访问都可以

[hot data limit\n data cold out] ->
[consumed cold data enqueue\n pipe event write] -> 
[pipe event noticed,\n read and dequeue ]-> 
[thread pool add job\n do queuejob asyc]

生成图像

+—————-+ +—————————-+ +———————+ +———————+ | hot data limit | | consumed cold data enqueue | | pipe event noticed, | | thread pool add job | | data cold out | –> | pipe event write | –> | read and dequeue | –> | do queuejob asyc | +—————-+ +—————————-+ +———————+ +———————+

还算省事儿,有机会读读代码实现。(又挖坑)


Read More


读斯通纳

追求绝对自我的人生体验,居然不落寞,很精彩,这是很难想象的,本宅男生活远没有这么精彩

另外听说凯西阿弗莱克要演这个的影视版,消息起码有五六年了,好莱坞宁愿拍犬之力这种大便也不愿意拍失败者。失败者是真滴无聊。就像我

Read More

使用ssh访问 virtualbox,端口转发

使用ssh访问 virtualbox,端口转发

前提环境 ubuntu 1804

安装并开启sshd

apt install openssh-server

service start sshd

设置端口转发

使用ssh -p 12345 root@localhost 访问即可


到此为止下面是牢骚

本来WSL都能搞定大部分场景,但是会把环境搞乱,虽说重装wsl也不麻烦

决定用docker来做实验环境,但发现业界都转k8s了?

不过docker确实很好用,准备用一用,但是wsl仅在hyper-v条件下才支持docker server daemon,基于这个条件,可以server命令启动,也可以安装docker for windows来导入,连接有很多就不列举了

有个issue 解释了半天也没说(或者我没看明白)不用hyper-v能不能用docker,所以只能搞虚拟机,还要在开个窗口麻烦,所以搞个转发wsl访问


Read More

Little Dump

layout: post title: 一些二进制分析工具记录 categories: tools tags: []

[toc]

Read More

Little Cmd

layout: post title: 常用快捷键/命令行/系统设定 categories: tools tags: [linux, macos, windows, vscode, vim, shell, docker]

[toc]

Read More

^