作者:金鸽
欢迎访问 sinodragon21.cublog.cn
1、学习使用Linux,先记住一个自助式命令: man
man -f [command]
man -k [command]
man X [command] (其中'X'为数字,代表man -f [command]查询结果中,提示该command处于Mannual的第几部分部分)
2、学习使用DOS,先记住一个自助式命令: ?
[command] /? (查询该命令的使用方法)
3、学习使用gdb,先记住一个自助式命令: help
help [topic]
比如,你想知道如何打断点breakpoint,就在gdb的提示符后面输入 > help breakpoint;
还有几个常用的命令: [s]tepinto(相当于VC里的F11),[f]inish(相当于VC里的stepout),
Linux下gdb调试,还可以在某一个具体的内存打断点:[b]reakpoint *[addr](addr代表你的内存地址),这个在定位内存泄露或者踩内存(coredump)等问题时颇为有用。
4、学习设置VIM的万能命令—— :set all
:set all 可以列出VIM中可供用户设置的所有选项,你在里面找那个和你想要设置的功能相关,试着设置一下,就OK了。如果还是不起作用,在网上搜索一下:set all中可能有效的选项如何使用,在努力一把。
今天碰到一个问题,:set noshiftround,不起作用。后来发现是:set cindent在作怪。当你设置了cindent时,从其他地方copy的代码,通过p命令粘贴到你的VIM编辑器时,会不断的indent,搞的代码和楼梯似的,乱成马列。先:set noautoindent,再:set noexpandtab,不起作用;retry,:set shiftwidth=1,起作用了,但还是楼梯状,不过indent=1;tritry,:set noshiftround,还不如:set shiftwidth=1呢,又indent=8了。最终发现是cindent在作怪,关闭之便好,方法:set nocindent。
5. Although the present Windows Sockets specification defines the sockets abstraction for TCP/IP, any network protocol can comply with
Windows Sockets by supplying its own version of the dynamic link library (DLL) that implements Windows Sockets.
--From: Windows Sockets: Background, MSDN Library
Window的socket是一个抽象的概念,目前支持TCP/IP协议族,你可以编写新的DLL来满足新的网络协议的需要,比如SCTP等新的通讯协议。(万剑归宗)
6.
7. [Student Course]
/* sinodragon21 add 2010-7-18 below*/
8. 学习内存管理,就不得不学习malloc和free,那么你知道malloc和free是如何实现的吗?接着问自己:free函数的入参是一块内存的头指针,free怎么知道释放多大的地址范围?释放后这些内存交给了谁管理?有时候明明释放了,可是top看到的内存信息还是没有释放?这是为什么?是内存泄露?还是其他原因?
现在的计算机系统越来越复杂,从硬件到我们运行的程序(进程),内存管理被分为不同的几个层次,不同的操作系统,其设计各有特色。大致上,可以分为以下几
个层次:
[硬件] --> [虚拟内存系统] --> [系统级的Heap管理] -->
[进程级的Heap管理(libc)] --> [我们的进程malloc/free]
对于偏左的几个层次,我们可以暂时不了解,
但看看 libc 中 malloc/free
的实现,还是很有意思的,不过现在的系统(硬件/操作系统)都无比复杂,直接阅读最新的代码,一头扎入最复杂的逻辑中,对我们理解其基本原理,实在没有益
处。
去繁就简,我们看看早期 BSD 的一个实现。参看最早的一个版本 v1.1
实
现很漂亮,代码很少,但可以看到一个 allocator 看得见摸得找的"高效"实现,里面的技巧,SGI STL allocator 也在使用。
总结:学习疑难技术的方法:寻找切入点(比如这里的free/malloc),再学习其发展历程,最好从它最简单最原始的阶段开始抽丝剥见。(侯捷解剖MFC时使用的便是此法)
学习本质的利器:FreeBSD的早期实现版本的源代码(学习Revision Tree中的最早版本)
From:
/* sinodragon21 add 2010-7-18 above*/
9. 编译成功,但链接时报错:unreferenced symbol: #####. 说明你链接时使用的静态库不存在,或者该静态库版本不正确。诊断方法:
Windows平台: 使用dumpbin /SYMBOLS XXX.lib /OUT:XXXlibsymbol.txt,生成静态库的符号表,在生成的XXXlibsymbol.txt中查找#####,如果找不到,则您需要拿到正确版本的静态lib库先。
Linux平台: 使用nm/objdump工具,生成静态.a库的符号表,其他同上。
To be continued ...
阅读(1368) | 评论(0) | 转发(0) |