调试相关

1、Windbg

常用命令

符号表加载

srv*E:\down\symbols*http://msdl.microsoft.com/download/symbols

~xs:  切到x线程
!analyze -v:    windebu帮助分析
u 地址1 地址2:  查看地址1和地址2之间的反汇编
uf 函数名:反汇编函数信息
!runaway :     查看各线程CPU运行时间
kb:看堆栈,先使用~xs切换到具体线程模块进行查看
kbn:显示frame信息

lm: 查看加载的库及库是否加载符号表成功
!address eax查看对应内存页的属性
.reload:重新加载符号表命令
.dump /ma D:\\test.dmp :抓dmp文件

x 模块名!*,该模块下所有函数信息

!sym noisy开启符号的"吵杂模式", .reload /i NetAppSoft.exe

.frame 01:切换到索引号位01的栈上? 此时通过View-》local可以查看本地变量。需要配合kbn使用

bp:加断点,bl:显示断点,bc:清除断点

open -a 函数信息:直接在windbg中显示源码(前提是设置了源码路径)
ba wl 地址:加访问某处地址断点
.load wow64exts !sw; 32位系统和64位系统在不同版本下分析dump文件需要进行文件转化

.ecxr:如果使用自动抓dmp,需要显示异常,先使用ecxr命令

chesym:检查pdb是否一致,否则windbg会经常报符号表可能不一致问题

dd:查看某内存值:display dword

dt::查看没变量类型:display type


死锁问题:
!lock:查找lockcount大于1的锁信息
~~[x]s:切到某线程
!cs 锁地址

 

内存问题:
windows自带的性能监视器查看内存增长情况Perfmon.msc
cmd:
cd windebug目录
1、gflags -i 4200.exe +ust
2、set _NT_SYMBOL_PATH=srv*D:\down\symbols*http://msdl.microsoft.com/download/symbols;otherpath;

3、umdh -p:8208 -f:e:\log1.txt

.....
4、umdh -p:8208 -f:e:\log2.txt
5、umdh -d e:\log2.txt e:\log1.txt > e:\cmp12.txt
分析比较结果
1.cmp1234.txt就是两个时刻的Heap Stack Trace的差别,它类似于以下信息:
+ 5320 ( f110 - 9df0) 3a allocs BackTrace00053
Total increase == 5320

更多命令直接查看windebug的help,F1即可

内存其它检测:

可以重载new为new(type, __FILE__,__LINE__)检测出哪些new在退出时未释放内存

 

两个进程间调试

1.1       两个进程的调试:A进程创建了B进程,这个时候如果要调试B进程的方法有两种:

1.2    使用windebug:windebug挂载运行进程A,之后敲入命令:.childdbg 1即可。Windebug会在A调用B的时,进入程序中的断点(使用windebug打开程序打断点)

1.3    使用vs自带的attach:运行进程A,执行调用B的过程,B执行起来后,打开B的vs源代码,使用attach附加到B进程中即可。

 

2、远程调试

 vs2008:
在PC1上使用vs2008安装目录下msvsmon.exe即可,2008的msvsmon.exe更加完善,增加了图形化界面,也更加简单方便。
在调试机器上附加到远程进程即可。

调试相关_第1张图片调试相关_第2张图片


另外vs2008下release不进入断点问题解决:
1. 属性->C/C++->常规->调试信息格式:设置为-程序数据库(/Zi)
2. 属性->链接器->调试->生成调试信息设置为是

你可能感兴趣的:(调试相关)