推荐使用PageHeap.Exe和Gflags.Exe,主要的原因还是因为当有人问内存越界的错误如何查出来的时候,国外的朋友经常会推荐这两个工具(highly recommend)。我用过之后,也觉得有些时候用用还是有好处的。
PageHeap.Exe将针对某个指定的应用程序启用Page Heap标志,从而自动监视所有的malloc、new和heapAlloc的内存分配,出内存错误。
PageHeap.Exe的下载地点:
download.microsoft/download/vc60pro/utility/6.0/win98/
下面我们简单地给出PageHeap使用步骤:
第一步:
在命令行中运行PageHeap.Exe。如果你以前设置过启用Global Page Heap标志,那么你将看到一个列表,给出所有已经启用了的应用程序的名字,不含路径。
如下所示:
C:\>pageheap
<                                  enabled
<                            enabled
第二步:
编译一个小程序,其中有如下代码:
void main()
{
int m_len = 5;
char *m_p = (char *)HeapAlloc (GetProcessHeap (),    HEAP_ZERO_MEMORY, m_len);
m_p[m_len] = 0;
HeapFree (GetProcessHeap (),0, m_p);
}
Build出一个Debug版本。运行之,你看不到有任何异常的报告。
但其实m_p[m_len]=0这句话就是越界写了,因为只分配到了m_p[m_len-1]!这种情况就叫Dynamic memory overrun。用BoundsChecker是可以查到的。
这时,表面上看不出任何问题,但是一颗定时已经埋下了。
第三步:
在命令行中运行PageHeap / 0x01。
再运行一次不带参数的PageHeap,察看上面的命令是否生效。你的应用程序应该在启用的列表中。
注意:千万不要在YourApplication.Exe前面加上路径!!
0x01的含义在后面说明。
第四步:
再次运行你的程序。
你将会注意到在Output窗口的加载各种DLL之前,多了几句话:
Loaded exports for 'C:\WINNT\System32\ntdll.dll'
Page heap: process 0x57C created heap @ 00130000 (00230000, flags 0x1)
Loaded 'C:\WINNT\system32\MFC42D.DLL', no matching symbolic information found.
..
Loaded 'C:\WINNT\system32\MSVCP60D.DLL', no matching symbolic information found.
Page heap: process 0x57C created heap @ 00470000 (00570000, flags 0x1)
Loaded exports for 'C:\WINNT\system32\imm32.dll'
这就是Page Heap的监视机制在发挥作用!他告诉你你的堆00470000被创建出来了。
然后程序退出后,Output窗口有这么几句话表明一定有什么错误发生了:
Page heap: block @ 0015AFF8 is corrupted (reason 10)
Page heap: reason: corrupted suffix pattern
Page heap: process 0x57C destroyed heap @ 00471000 (00570000)
The thread 0x8A8 has exited with code 0 (0x0).
这说明在销毁堆00470000时遇到了麻烦,就是数据块0015AFF8被误用了,原因是误用了下标语法。看,说得多么清楚!也节省了
许多翻来覆去查代码的工作!
PageHeap的使用中有几点值得注意:
1:启用PageHeap不能够影响正在运行中的应用程序。如果你需要启用一些正在运行且不能重启的程序的PageHeap,那请运行PageHeap启用后,重新启动机器。
2:要想查看PageHeap把信息放到哪里了,请打开你的注册表,来到HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
你将会看到你的应用程序也在这个项下面。你的应用程序的GlobalFlag被设置为了0x02000000,PageHeapFlags被设置为了0x01。
3:PageHeap的原理是这样,它在已分配的内存的后面放上几个守护字节(Guard Bytes),再跟上一个标记为PAGE_NOACCESS的内存页。这样,已分配内存的后面如果被重写了,那么守护字节就会被改变,于是当内存被释放时,PageHeap就会引发一个AV(Access Violation)。大体上就是这样。所以只有最后释放这块问题内存时,才会有PageHeap的报告!这就是PageHeap的局限性吧。
参数0x01的含义:
FLAGS hex value (0x...) has the following structure:
B7-B0  Bit flags    1 - enable page heap
01 - enable page heap. If zero normal heap is used. In 99% of the cases you will want this to be set.
02 - collect stack traces (default on checked builds)
04 - minimize memory impact
08 - minimize randomly(1)/based on size range(0)
10 - catch backward overruns
看到了吗?你还可以设置参数为0x10,从而可以检查内存向前的越界写!
Gflags.Exe是微软的Debugging Tools里面的工具。在Windows 2000的Resource Kit中也可以得到。我们也可以用它来完成和PageHeap相同的任务。当然,Gflags.EXE还能做许许多多其他的事情。这里我们就不介绍了,总之物超所值。
具体的使用办法是:
1)    运行Gflags.Exe;
2)  你将看到一个对话框。在”Image File”的编辑框中写下你的应用程序的名字,如YourApp.Exe。注意不要路径!
3)  选择”Image File Options”的单选钮;
4)  这时,你会看到对话框的内容突然一变。选中“Place heap
allocations at ends of pages”前的复选框。
5)  点击Apply按钮。
这样,就达到了PageHeap的效果。现在运行你的程序,overwrite你的堆,就应该生成一个AV了!
(请结合查看微软KB:SAMPLE: Finds Heap Corruption and Memory Errors (Q264471))
srv*f:\symcache*msdl.microsoft/download/symbols
ls PTZProxyService | grep so | sed -e "s/.so$//g" | sed -e "s/^lib/-l/g"
Red Hat/Fedora Linux有提供一个非常棒的系统升级机制Red Hat Network,当Red Hat公司修正或发表新的RPM程序套件时,如果您想要将某些程序升级成新的RPM套件,只要连接到dhat/网站, 该网站就会自动侦测系统中应该更新的RPM套件,并自动下载安装替
您更新,这个功能非常类似Windows系统的Windows Updates在线升级功能。虽然Red Hat Network有这种好处,但这个服务是专为商业用户而设的,因此向使用者收费亦是必然的,付费会员是年缴60元美金,但由于在线升级服务的质量良好,全 球有大量的使用者付款向Red Hat购买这种服务。
但是对于一般不是商业的用户,也可以登入Red Hat Network网站并注册一个账号使用在线升级机制。但是自从Red Hat公司于2003年9月宣布不再发行Red Hat Linux免费版本之后,所有Red Hat Linux爱好者迫切想知道如何继续使用Red Hat Network这个在线升级机制?Red Hat的CEO Mathew Szuilk为
Red Hat的爱用者解释往后Red Hat Network的运作机制,Red Hat公司指出使用Fedora Core并搭配YUM (YellowDog Updater, Modified) 即可免费的继续使用Red Hat Network下载最新修补软件。
YUM的全名是YellowDog Updater, Modified,YellowDog (llowdoglinux/ ) 是一个Linux发行套件的名称,YellowDog Updater (YU) 是YellowDog这个Linux套件自行开发的RPM软件套件管理系统,这个YU系统的特是可以配合网络上的软件数据库直接进行软件的更新和移除, 后来美国Duke University将之改良,所以改命名为YellowDog Updater, Modified (YUM),yum可以自动更新/移除RPM套件,它会自动计算相依性,判断哪些RPM套件应该安装而哪些不必安装,正因为yum的出现可以解决安装 RPM套件时烦人的相依性 (dependency) 问题并且可直接透过网络进行系统升级,所以Red Hat与Fedora社将yum纳入共同开发的Fedora Core Linux之内,这个yum软件于是成为了Red Hat Network更新软件系统up2date的骨干,所以您可以很容易地透过yum自动升级Fedora Code Linux系统。
取得 yum
基 本上因为yum与up2date是Fedora Core预设的在线升级系统,所以您的Linux系统已经预设安装了。如果您的系统还未安装这两个套件,可以从Linux DVD安装光盘的Fedora/RPMS/ 取得yum-2.arch.rpm、up2date-4.3.47-5.i386.rpm以及up2date-gnome- 4.3.47-5.i386.rpm。或者从YUM的 www.linux.duke. edu/ projects/yum/ 下载最新版的YUM。
u yum: www.linux.duke.edu/projects/yum/
安装 yum
# rpm -ivh yum-2.arch.rpm # rpm -ivh up2date-4.3.47-5.i386.rpm # rpm -ivh up2date-gnome-4.3.47-5.i386.rpm
设定yum服务器
要 利用yum自动升级Linux系统之前,您必须先设定可供您索取RPM档案的yum服务器。因为yum升级系统并没有另外发展新的通讯协议,它下载档案的 方式主要是透过http与ftp通讯协议来取得档案,也就是说放置Fedora Core Linux更新档案的WWW站或者FTP站都可以当作您的yum服务器。因此一台离您较近的服务器会让更新进度快速的完成,否则内订的服务器http: //dhat 因为远在美国,
我们要透过它来升级系统,只能说慢的可以。而要寻一台可供信赖且距离近的yum服务器,最简单的方法就是从Fedora dhat/ download /mirrors.html查出全球服务器的mirror列表,然后一台离您最近的服务器,再将它设定到 /f档案中即可。底下就是几个离我们较近或速度较快的服务器:
国外 yum 服务器
安装光盘套件
/fedora/core/3/i386/os/
升级套件
/fedora/core/updates/3/i386/
安装光盘套件
ftp.freshrpms/pub/fedora/linux/core/3/i386/os/
升级套件
ftp.freshrpms/pub/fedora/linux/core/updates/3/i386/
国内yum服务器
ftp.isu.edu.tw/pub/Linux/Fedora/linux/core/3/i386/os/
ftp.isu.edu.tw/pub/Linux/Fedora/linux/core/updates/3/i386/
linux.cdpa.nsysu.edu.tw/Linux/Fedora/linux/core/3/i386/os/
linux.cdpa.nsysu.edu.tw/Linux/Fedora/linux/core/updates/3/i386/
以 为例,您必须先知道该FTP站将Fedora Project官方更新的RPM套件放置在哪一个目录底下,该目录通常是以Linux发行套件的版本名称如fedora为字眼,然后再搭配版本号码、系统 平台如i386,最后以updates为字眼,您只要一层一层下去最后只要『到放置header/目录那一层的网址』即可,因为yum得靠 header/目录下的header.info档案到您所要安装RPM套件的位置,例如:笔者已经替您好某台服务器的路径了,您可以使用浏览器到下列 网址看看,是否有header/目录。
/fedora/core/3/i386/os/  (安装光盘套件)
/fedora/core/updates/3/i386/ (升级套件)
当 然您也可以选取其它的FTP站,并不一定要使用笔者设定的FTP站,而且将来若yum服务器上的路径有所更改,您要记得使用FTP程序或者网页浏览器到该 FTP站或网站上确定正确路径之后,再设定到f档案中即可。再来请编辑 /f设定档:
# gedit /f
/fedora/core/3/i386/os/  (安装光盘套件)
/fedora/core/updates/3/i386/ (升级套件)
修改完网址并存盘之后即完成 /etc
/f的设定,完整的设定档如下:
/f设定档内容
[main]
cachedir=/var/cache/yum
exiteddebuglevel=2
logfile=/var/log/yum.log
pkgpolicy=newest
distroverpkg=redhat-release
tolerant=1
exactarch=1
retries=20
obsoletes=1
gpgcheck=1
# 以上段落为内订设定,不需更改
# PUT YOUR REPOS HERE OR IN separate files po
# in /pos.d
# 告诉您可以直接将YUM升级网址放在此,或者另存成档案放在
/pos.d目录
# 为了方便性,您可以直接填写在 /f 即可。
[base]
name=Fedora Core $releasever - $basearch - Base
baseurl=/fedora/core/3/i386/os/
# 请加入此段Fedora安装套件的网址描述
[updates-released]
name=Fedora Core $releasever - $basearch - Released Updates
baseurl=/fedora/core/updates/3/i386/
# 请加入此段Fedora升级套件的网址描述
# 底下testing与development的网址不用理会,维持批注掉即可。
#[updates-testing]
#name=Fedora Core $releasever - $basearch - Unreleased Updates
#baseurl=dhat/pub/fedora/linux
/core/updates/testing
#[development]
#name=Fedora Core $releasever - Development Tree
#baseurl=dhat/pub/fedora/linux
/core/development/$basearch/
在 此教您一个小技巧,如果网址太长很难输入,建议您先利用ncftp或者网页浏览器先连接到您预备设定为yum server的FTP站,然后确认其放置Fedora安装套件的位置,以及Fedora升级套件的位置之后,然后执行pwd显示目前所在位置,这样就可以 轻易地取得整个网址了。
启动 yum 升级系统
# yum check-update   (检查需要升级的套件)
Gathering header information file(s) from server(s)
Server: Fedora Core 2 - i386 - Base
Server: Fedora Core 2 - i386 - Released Updates
Finding updated packages
Downloading needed headers
iiimf-protocol-lib-1-11.4 100% |===================| 5.3 kB 00:00
xorg-x11-xauth-0-6.7.0-5. 58% |======== | 40 kB 00:01 ETA
第 一次执行yum check-update必须花比较久的时间,因为yum必须检查服务器上所有header数据,请耐心等候。完成之后,往后第二次执行 yum check-update就会很快了,因为数据已经储存到您的系统上。而在使用yum升级系统之前,基于系统安全性考虑,yum需要所有RPM套件的 GPG认证金钥,认证升级RPM套件的完整性之后,才能安全地帮您自动升级系统,所以您必须先加载Fedora DVD安装光盘的RPM-GPG-KEY与RPM-GPG-KEY-fedora这两个GPG认证金钥档案,才能执行yum update自动升级所有RPM套件。
# rpm --import RPM-GPG-KEY
# rpm --import RPM-GPG-KEY-fedora
# yum update   (自动升级所有RPM套件)
[update: mkisofs 8:2.01-0.a27.4.FC2.1.i386]
[update: rsync 2.6.2-1.i386]
[update: kdelibs 6:3.2.2-6.i386]
[update: xorg-x11-libs 6.7.0-5.i386]
[update: nfs-utils 1.0.6-22.i386]
[update

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。