中文版Visual Studio下调试Brew MP程序的方法

2010年12月01日 星期三

装了Brew MP的开发环境,但调试不行,按BMP工具栏上的”Debug”图标,会出”无效的索引”对话框,按F5会让你选择调试程序,设为BMP的模拟器,倒是可以起来,但加不上断点。问了同事,说是中文版Visual Studio的问题,换了英文版就行了。可我不想那么麻烦地再重新卸载安装。网上搜来搜去,也都是这么说的。只好自己琢磨了。

其实Brew程序在模拟器下调试也就是调试一个DLL,没什么理由不行的。于是把Brew MP的模拟器运行起来,用附加进程的方式将调试器附加到Simulator.exe,发现还是加不上断点。用ProcessExplorer查看,发现Simulator.exe并没有调用要调试的BMP app的DLL,而是另一个进程SimTargetExecutor调用了DLL。将调试器附加到这个进程,还是不行。最后在附加进程对话框中找到一个选择代码类型的选项,设为”本机+托管”,而非缺省的”自动”,居然OK了。想来应该是这个SimTargetExecutor是个.NET的托管程序,而我们的dll是个native的程序,因此缺省”自动确定”的话,会当成调试托管程序,native程序的断点就打不上。

这样就好办了,把解决方案的属性中的”调试”中,”命令”设为”SimTargetExecutor.exe”,”调试器类型”设为”混合”,”附加”设为”是”,按F5即可启动模拟器并调试,加断点什么的都没问题。唯一的缺点是它不会自动启动我们的BMP app,得退到AppManager中,再选择我们的app启动。当然提前加上断点时,由于dll尚未载入,因此是个带问号的无效断点样式,只要app启动起来,就可以了。

Powershell创建目录+更改文件名

2010年10月13日 星期三

要将一堆1001.png, 1002.png变成1001目录下的icon.png, 1002目录下的icon.png,写了个Powershell脚本,先创建子目录,再将文件移动过去

  1. ls *.png |
  2. % {
  3.     if($_.fullname -match "([\d]+)\.png") {
  4.       echo $($($matches[1]))
  5.       New-Item -Path $($($matches[1])) -ItemType Directory -Force
  6.       Move-Item -Path $_.fullname -Destination "$($($matches[1]))\icon.png" -PassThru -Force
  7.     }
  8.   }

将笑笑的博客迁到这里了

2010年10月06日 星期三

前一阵子听说MSN要关闭Live Spaces, 就一直想着笑笑原来的博客是http://xinyixiaoxiao.spaces.live.com, 虽然好久没写了,但是原来的东西不能丢了。今天想做一做,上去一看,发现已经太长时间不登陆,原来的Live ID已经作废了,也就是说我进不去了。一下子有些懵,这下还能恢复吗?下决心如果没有办法的话,就再做一次当年把自己的博客转到这里时的精神,每篇文章再重新”拷贝+粘贴”一次。

话说在网上找了半天,一些搬家服务也试了试,都不行。最后找到了http://lipeng.de/blog/apple/347/,主要还是weiwei大侠写的 live-space-mover,一个Python写的脚本。运行中间断了一次,还以为又有什么问题,后来发现是原来的网站就不通了(你说Microsoft的这玩意怎么这么不稳定啊)。还好live-space-mover有cache,过了一阵子看网站恢复了,再运行,这下出现 出现 Finished! Congratulations!了,生成了一个xml文件。

然后回这里的管理界面,选择导入Wordpress, 选择生成的xml文件,选择作者名(或者新创建一个),然后就OK啦。

最后一篇日志是 2009年2月的 :-( 自从回捷通上班以来,确实很多事情都落下了。包括现在也不上MSN,也不上QQ了。生活在继续,可不停在变幻。

这个假期的后几天着实做了几件遗留已久的事。Apple Deveoper ID试通了,把HTC Desire刷到了Android 2.2,把笑笑的博客迁过来了。还有一件事,dreamhost上的ssh似乎不能用了,因此好几天都没法翻墙了。好像dreamhost发过一封信,还得再查查。

mac上的谷歌输入法

2010年10月05日 星期二

下载了mac上的谷歌输入法, 还凑合. http://marc.f2e.org/Google Pinyin.pkg.zip

升级HTC Desire到Android 2.2

2010年10月05日 星期二

按照http://itbbs.pconline.com.cn/mobile/11798922.html的步骤,更新我的HTC Desire到Android 2.2. 终于摆脱可恶的古兰经了。据说也可以安装程序到sd卡了,试试看.

MacBook 下安装Win7 ghost版和VMware

2010年09月04日 星期六

买了一台MacBook Pro 372,作为给自己的生日礼物吧。

买的时候让店里的人给装了个BootCamp的XP,回来还是想试试装Win7,但我的Win7是个ghost版的,于是试啊试的,终于被安装上了。

1 在Mac里面启动BootCamp助理,开始安装。

2 用光盘启动后,执行里面的ghost,复制分区到Windows分区。

3 复制完成后,直接想启动Windows分区,是无法启动的。原因应该是启动缺省用的是分区1,但在BootCamp里面,Windows分区是分区3。

4 仍然用光盘启动,进入WinPE,进行分区表修复

5 这时候再启动Windows分区就能启动了

6 插入MacOS的光盘,安装驱动程序。

这时候,盗版Win7里面自带的一个激活工具也无法使用了,它好象也是要修改grldr, 又会把分区改掉。找了半天,找到一个OEM激活的,发现能用。

然后回到MacOS里面,安装VMware Fusion, 选择建立BootCamp的虚拟机。再用Spaces把启动的Windows虚拟机搞到新的桌面上,很爽~~

第一次应用Powershell

2010年09月01日 星期三

在日志中要统计一下收到多少次短信,试了试PowshellShell, 确实比较方便

  1. Select-String e:\temp\logger\*.log -pattern "收到的短信" -Encoding "Default" | Measure-Object

日志是用GB码的,所以要带上 -Encoding “Default”

结果是:

Count    : 2947
Average  :
Sum      :
Maximum  :
Minimum  :
Property :

一个网站崩溃问题的解决方法之总结

2010年08月20日 星期五

问题

公司的网站(ASP .NET MVC的架构) 频繁重启,甚至超过进程池的快速失败保护,导致Service Unavailable。

在自己的日志里,只有重启的记录,没法查到哪里出的错。看IIS日志,也没看出什么来。

事件查看器里面,重启的时候有下面的描述:

EventType clr20r3, P1 w3wp.exe, P2 6.0.3790.3959, P3 45d6968e, P4 system.data.linq, P5 3.5.0.0, P6 488ef99a, P7 92c, P8 0, P9 system.stackoverflowexception, P10 NIL.

可以看出来,是某个地方stack overflow了,但具体是哪里,事件查看器也没有记录堆栈信息(是不是因为太大了,无法记录?)

抓dump文件

希望出异常时能够将堆栈转储出来。原来做C++的时候,比较清楚注册表里AeDebug (HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\Current Version\AeDebug) 的设置,看了看是vsjitdebugger.exe,这是因为这台机器上最早装过vs 2005。可是这个vsjitdebugger是弹出提示的,并没有转储信息。

删除之,用drwtsn32 -i,注册了dr. watson,以前都是用这个转储的。但发现崩溃后,并没有转储东西。搜了搜,发现这个只是用来处理非托管代码的(比如C++),而托管代码需要再另一个注册表项里面: HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\DbgJITDebugLaunchSetting和DbgManagedDebugger。

看了看这两个设置: DbgJITDebugLaunchSetting = 0×10, DbgManagedDebugger = vsjitdebugger.exe。看了下进程管理器中,居然有了300多个vsjitdebugger.exe进程。把vsjitdebugger.exe进程全部杀掉,注册表里面的DbgManagedDebugger也给干掉了。

这时候,崩溃时不会再出vsjitdebugger.exe进程了。但事件管理器中会出现新的错误:

事件 ID ( 0 )的描述(在资源( .NET Runtime )中)无法找到。本地计算机可能没有必要的注册信息或消息 DLL 文件来从远程计算机显示消息。您可能可以使用 /AUXSOURCE= 标识来检索词描述;查看帮助和支持以了解详细信息。下列信息是事件的一部分: .NET Runtime version : 2.0.50727.3603 - 未找到调试器。未指定注册的 JIT 调试程序。 单击”重试”使进程处于等待状态,此时可手动附加调试器。 单击”取消”可中止 JIT 调试请求。

这个无所谓,找不到DbgManagedDebugger了嘛,把DbgJITDebugLaunchSetting 改个其它值也就行了。可是我想转储啊,这里有什么可以转储了。

主角出现:下载Debugging Tools For Windows. 安装。然后将jitdebugger设为cdb.exe (其实这里只需要托管代码的,AeDebug只是顺手),将错误转储到c:\crash_dumps下。运行下面的reg文件即可:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
“DbgManagedDebugger”=”\”c:\\debuggers\\x86\\cdb.exe\” -pv -p %ld -c \”.dump /u /ma c:\\crash_dumps\\crash.dmp;.kill;qd\”"
“DbgJITDebugLaunchSetting”=dword:00000002
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug]
“Debugger”=”\”c:\\debuggers\\x86\\cdb.exe\” -pv -p %ld -c \”.dump /u /ma c:\\crash_dumps\\crash.dmp;.kill;qd\”" “Auto”=”1″

如果是64位机器呢,则上面是x64目录下的cdb,再将[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework]和[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug]下面的相应项设为x86的。

好了,抓到dump文件了。

查看dump文件

用windbg来打开。记住先设置好Symbol File的目录: D:\TXWap_Work\www\TXWap\bin; c:\symbols; srv*c:\symbols*http://msdl.microsoft.com/download/symbols

前面的是自己本地的工作目录,下面有自己DLL相应的pdb。而后面的是说系统没有的话,到某个网站去下载符号文件。

然后再windbg中打开dump文件。

在windbg中要调试托管代码,需要加载一个调试器扩展SOS(Son of Strike),这个工具在Debugging Tools For Windows里面就有了。因此只要下面这样加载SOS.dll:

.loadby sos mscorwks

然后看所有的线程:

!threads

PreEmptive GC Alloc Lock
   ID OSID ThreadOBJ State GC Context Domain Count APT Exception
   20 1 3210 000dc110 1808220 Enabled 00000000:00000000 00105678 1 MTA (Threadpool Worker)
   31 2 4430 000e9fa0 b220 Enabled 04d9213c:04d93f5c 000ccbc0 0 MTA (Finalizer)
   32 3 3190 00100d48 80a220 Enabled 00000000:00000000 000ccbc0 0 MTA (Threadpool Completion Port)
   33 4 fc4 00102f00 180b220 Enabled 00000000:00000000 00105678 1 MTA (Threadpool Worker)
   34 5 15a4 00104c60 1220 Enabled 00000000:00000000 000ccbc0 0 Ukn
   35 6 30dc 001178f0 180b220 Enabled 0d303d20:0d304e60 00105678 1 MTA (Threadpool Worker)
   36 7 466c 00130a30 180b220 Disabled 0d313ac8:0d314e68 00105678 1 MTA (Threadpool Worker)
   21 8 f64 00151d08 180a220 Disabled 0335d2cc:0335da50 00105678 1 MTA (Threadpool Worker)
   39 9 3010 1b2d5070 180b220 Enabled 093004c4:0930057c 00105678 1 MTA (Threadpool Worker) System.StackOverflowException (0ecf00a4)
   41 a 28f0 1b2e2778 180b220 Disabled 11414e0c:11415924 00105678 1 MTA (Threadpool Worker)
   42 b 2174 1b2e2b70 380b220 Enabled 00000000:00000000 00105678 0 MTA (Threadpool Worker)
   43 c 35f4 1b2e3478 180b220 Enabled 11124dd8:111254d8 00105678 1 MTA (Threadpool Worker)
   44 d 1b98 1b2e40e8 180b220 Enabled 032e0e28:032e1a50 00105678 1 MTA (Threadpool Worker)
   45 e c98 1b2e4ac8 380b220 Enabled 00000000:00000000 00105678 0 MTA (Threadpool Worker)
   46 f 23e4 1b2e5608 180b220 Disabled 09300c70:0930257c 00105678 1 MTA (Threadpool Worker)
   47 10 2764 1b2e6148 380b220 Enabled 00000000:00000000 00105678 0 MTA (Threadpool Worker)
   48 11 2318 1b2e6c88 180b220 Disabled 0b3e4124:0b3e5dc8 00105678 1 MTA (Threadpool Worker)
   49 12 1cbc 1b2e77c8 380b220 Enabled 00000000:00000000 00105678 0 MTA (Threadpool Worker)
   50 13 560 1b2e8338 180b220 Enabled 0b3707ac:0b3719d0 00105678 1 MTA (Threadpool Worker)
   51 14 45c0 1b2e8ea8 180b220 Enabled 0917eacc:0918057c 00105678 1 MTA (Threadpool Worker)
   52 15 28e4 1b2e9a90 180b220 Enabled 07281228:07283190 00105678 1 MTA (Threadpool Worker)
   18 16 17a0 1b2d7fc0 180a220 Enabled 00000000:00000000 000ccbc0 0 MTA (Threadpool Worker)
   53 17 2f94 1b383e38 380b220 Enabled 00000000:00000000 00105678 0 MTA (Threadpool Worker)
   XXXX 18 9c8 1e853958 80010220 Enabled 00000000:00000000 000ccbc0 0 Ukn

看到了哪个线程有异常了吗?切换到39线程:

~39s

看堆栈:

!clrstack

可以看到堆栈列表。定位到是我们哪个函数出的问题,后面的事情就好办了 :-)

入手一部HTC Desire G7

2010年08月11日 星期三

用起来还是挺爽的。有点小遗憾就是是个阿拉伯版的,有些预装程序还删不掉,看着《古兰经》什么的怪怪的,啥时候刷掉它。

新的在面前

2010年08月05日 星期四

集中精力,新的在面前