1,visual studio的 立即窗口 ,很有用,以前都是用计算器什么的。
2,visual studio可以对系统DLL的API下断点,只需要有pdb文件,Ctrl+B ,类似:{,,USER32.DLL}_MessageBoxW@16 后面的16是因为它有4个参数。
3,windows下应用Visual studio开发时,debug时应该选择MDD模式,release时选择MT模式,因为msvcrtd.lib含有很多有用的功能,包括内存越界、堆破坏检测等。
4,debug模式下进行性能监测/优化有时候是无意义的,比如inline甚至__forceinline的函数在debug模式下都不是inline的,这应该是为了方便debug所设置如此吧。
5,使用__asm{INT 3;}使程序在某一点陷入异常,从而利用debugger attach进去。
6,数据对齐,有三个概念:自身对齐大小,指定对齐大小,有效对齐大小,其中自身对齐大小为sizeof(int?),指定对齐大小为#pragma pack(8?),有效对齐大小为min(自身对齐大小,指定对齐大小)。对齐为变量访问地址对齐,而不是与其他变量进行对齐!!!且对齐只可能是2的n次方对齐,比如1,2,4,8,16,32等,不能6字节、10字节等对齐。并且要注意!结构体最后一个成员变量需要注意对齐问题,因为结构体数组的存在,结构体的最后一个成员变量需要确保下一个结构体的所有成员变量仍然是对齐的。
7,hook虚函数时,当你发现hook成功,但是你的函数并没有被调用时,有可能是编译器根本就没用到虚函数表。这是有可能的,当编译器确定没有歧义时,会直接调用相关函数。例如:Object obj;,声明了这样的一个对象,并且你已经hook了Object的虚析构函数,但是你的函数可能不会被调用。而Object* pObj = new Object();delete pObj;,此时则一定会通过虚函数表跳转到你的函数中,因为这时候编译器无法确定pObj是什么,所以运行时跳转。(应该说是编译器处于有点小聪明,但又不是非常聪明)——。
8,测试程序性能有两种方法:a,hook所有函数,对exe进行修改(编译时 or 运行时),进行测算;b,隔一小段suspend一下目标进程,检查eip,计数统计。
9,使用msvc未公开编译选项可以查看c++类的内存布局。使用方法:启动vs命令行,输入cl 【source.cpp】 /d1reportSingleClassLayout【CBaseClass1】以查看单个class的内存布局,输入cl 【source.cpp】 /d1reportAllClassLayout以查看所有类的内存布局。注意:/d1reportSingleClassLayout【CBaseClass1】没有空格 !!
10,线程本地存储(TLS),用于在线程函数内部static/global变量的使用,这时候这些变量仅仅想让它们在各自的线程中使用。
11,在每个构造函数/析构函数中,如果有虚函数表指针,则会在这些函数中修改虚函数表指针使其指向当前类的虚函数表。
12,vs2013允许对临时变量取地址操作,maybe是个bug!
13,引用全局变量/函数时最好加上双冒号(::)操作符,以区分全局/局部/成员变量。
14,debug关键段死锁时可查看其ownerthreadid,即可找到造成死锁的原因。
15,TortoiseGit 使用扩展名为ppk的密钥,而不是ssh-keygen生成的rsa密钥。使用命令ssh-keygen -C "邮箱地址" -t rsa产生的密钥在TortoiseGit中不能用。而基于git的开发必须要用到rsa密钥,因此需要用到TortoiseGit的putty key generator工具来生成既适用于git的rsa密钥也适用于TortoiseGit的ppk密钥,TortoiseGit开始菜单中的puttygen程序。这个工具可以转换这两种key,随便用 ~~
16,windows下修改git的ssh端口。当git服务器修改了默认的ssh端口后,windows客户端也需要修改成相应端口,否则会出现网络拒绝的问题。修改方法很简单:显示所有隐藏文件,修改git库目录下的./git/config文件中的URL为 ssh://[user@]host.xz[:port]/path/to/repo.git/ ,里面的user host这些自己改成相应的。
17,怎么修改vs的默认编码为UTF-8。visual studio的目录(C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcprojectitems)下有两个模板文件hfile.h,newc++file.cpp,将这两个文件用记事本打开另存为用utf-8覆盖即可。此后,再新建cpp时,会默认编码为utf-8。
18,android官打不开,可以用这个链接:http://androidappdocs-staging.appspot.com/index.html
19,g++最小化生成的二进制文件:gcc -Os -fdata-sections -ffunction-sections test.cpp -o test -Wl,--gc-sections ,然后再用gzexe命令进行压缩。
20,C++11中的raw字符串,必须要有括号才能生效。如:const char* thisUrl = R"(http://www.cnblogs.com/xylc/p/3437256.html)";
21,lambda可以直接使用全局变量,不需要捕获,捕获反而会出错。
22,opencv在linux下进行静态链接,命令:g++ -o example example.cpp `pkg-config --static --cflags --libs opencv
23,redhat下安装qt5 : sudo yum install qt5-qtbase qt5-qtbase-devel qt5-qtdeclarative qt5-qtdeclarative-devel qt5-qtgraphicaleffects qt5-qtquickcontrols
24,linux中如何在动态库中嵌入静态库:-Wl,--whole-archive ./static.a -Wl,--no-whole-archive -other.a
25,修改vs的默认编译警告级别:http://mihai-nita.net/2010/05/10/changing-default-vs-warning-level/
26,VC版本号判断宏:
MSVC++ 12.0 _MSC_VER == 1800 (Visual Studio 2013) MSVC++ 11.0 _MSC_VER == 1700 (Visual Studio 2012) MSVC++ 10.0 _MSC_VER == 1600 (Visual Studio 2010) MSVC++ 9.0 _MSC_VER == 1500 (Visual Studio 2008) MSVC++ 8.0 _MSC_VER == 1400 (Visual Studio 2005) MSVC++ 7.1 _MSC_VER == 1310 (Visual Studio 2003) MSVC++ 7.0 _MSC_VER == 1300 MSVC++ 6.0 _MSC_VER == 1200 MSVC++ 5.0 _MSC_VER == 1100
27,linux下sudo不需要输入密码的方法:sudo vim /etc/sudoers ,在root ALL=(ALL:ALL) ALL后面添加一行user ALL=(ALL) NOPASSWD: ALL 。
28,OpenCV中findContours函数无法找到与边缘相连的连通域,要想找到这些连通域,需要把边缘部分填充为背景再调此函数。