开发工具 | 重归混沌的BLOG

一次git事故

在开发过程中,我们的版本管理方式是,一版本一分支。之所以这样,是因为随着开发的进行,版本随时会分叉(这里分叉是指,两个版本都需要后续开发,但是对同一模块的功能需要不一样的微调)。 随着分叉之后的持续开发,就会导致多个分支之间差别越来越大。因此,如果所有版本都添加同样功能或修改同一个Bug时,是不可以采用git merge的方式来进行的。因为很难找到他相同的父节点。这时patch会是一个很好的工具。 而这次事故正是git patch功能使用不当引起的,下面来模拟出一个完整的……

C程序中让两个不同版本的库共存

今天有同学提出,如何在一个C程序中让两个不同版本的库共存。 首先想到的方案是,把其中一个版本的库函数全部重命名,比如把每一个函数名都加一个_v2的后缀。 人工替换到没什么,但是如果函数个数超过10个,就有点不拿人当人使了。 而使有工具去替换就会遇到一些棘手的问题,如何识别哪些是函数,哪些是系统函数(系统函数不需要添加后缀)等。 随后想到的另一个解决方案是C++的方案,为其中一个版本库中的所有文件添加命名空间。然后使用g++将这部分代码编译成.o文件,之后再使用gcc……

Git之坑

最近在使用Git进行多人协作时遇到了一些坑,在些处记录一下。 在使用git的过程中,最频繁使用的应该就是git pull了。在git pull命令时,一般会遇到下面几种情况。 如果是本地完全没有修改,则可以顺利进行git pull,如果有本地提交会与git pull下来的commit进行自动merge(当然自动merge也有可能失败,手动解决一下冲突即可)。 如果本地的修改与被git pull下来的commit中修改有相同的文件,这时git会报错提示,这时只让你先把本地修改commit或stash一下,也不会有太大问题。 最坑的……

为什么会有自动化测试框架

在研究敏捷开发中的TDD过程中, 接触到了UT(UnitTest)框架的概念.The Lego Batman Movie (2017) 在我的印象中, 自动化测试只需要每一个C模块中写一个对应的测试代码文件, 然后在Makefile稍加修改即可完成, 类似下面这样: //module_a.h int module_a_dosomething(); //module_a_test.c int main() { module_a_dosomething(); } //Makefile .... test:module_a_test ./module_a_test module_a_test:module_a_test.c module_a.c module_a.h gcc -o $@ $^ 只……

XP下JDK不能安装的解决办法

运行 cmd , 执行 “msiexec /unregserver” 然后 再执行 “msiexec /regserver” 

vim写程序常用技巧

"Set ma pleader let g:mapleader = "," set nocompatible set backspace=indent,eol,start "显示行号 set nu "标签 let g:miniBufExplMapWindowNavVim = 1 let g:miniBufExplMapWindowNavArrows = 1 let g:miniBufExplMapCTabSwitchBufs = 1 let g:miniBufExplModSelTarget = 1 "windows manger let g:winManagerWindowLayout='FileExplorer' nmap wm :WMToggle "打开语法高亮 syntax on "let asmsyntax="gas" let asmsyntax="nasm" "设置字体 set guifont=DejaVu Sans Mono 12 "……

关于ld -Ttext中的大小与text段在elf文件中的偏移之间的关系的猜想

在操作系统加载elf文件时都是按页映射的,而IA32下一页一般为4k,如果ld-Ttext 0x80400那么在操作系统去映设分页时应该是映射到0x80000~0x81000这个页表上的,但因为我们的text段入口地址为0x80400为了让程序去正确找到入口点,可以在text段之前构造SHT_NULL类型的无效段以便使text在文件中的偏移为0x400,这样在映射到页后,在加载时,直接跳到0x80400程序就能正常运行!