|
有没有发现一些程序在出错时会弹出一个输入框供提交bug?
当你的程序公开使用后必然会出现各种不可预料的错误,如果能捕获并由用户提交回
来就非常有利于我们的除错。
这其实非常简单,下面我们先说一下大致流程,再给出一个bug提交可运作的实例
(这里提供网页提交及程序提交两种处理方法):
流程:
a. 程序中在可能出错的地方使用异常处理, 在发布版本中打开异常捕获(自己的调试
版本可以不打开,以免调试不便)。
b. 当程序出错被捕获时弹出bug提交对话框,确定后调用bugreport把出错信息
(如:__FILE__,__LINE__)和当时相关环境信息及用户输入文本并发送出去。
c. 当发送失败时, 将信息累积保存下来供下次出现时一起提交或是由用户手
动调用bugreport.exe发送或是拷贝到官方网页上直接发送。
具体步骤如下:
一.建设站点(这里我们在自己同一台机上创建作测试):
1. 安装个人网站服务:
如果没安装"internet信息服务IIS"就先安装:
在winxp/nt上安装可打开控面板--添加删除/程序--添加删除windows程序--
internet信息服务IIS"---下一步到完成.(中途可能要插入系统安装盘)
在win98上安装则要自己找Personal Web Server安装程序来装(这个只有完整的98安装盘上有带)
注:缺省成功安装后有这样的目录: C:\Inetpub\wwwroot。
2. 激活个人网站服务:
在控件面板中打开"internet信息服务",双击internet信息服务下面的一项,右击"默认的web站点"
选"启动"
二.制作上传工具(具体内容付带后面):
1. 网页提交: 该网页放服务端虚拟目录下供浏览, 如: c:\Inetpub\wwwroot\bugreport.htm
2. 程序提交: 该程序放客户端供运行, 如: c:\bugreport.exe
三.网站接收程序(具体内容付带后面):
C:\Inetpub\wwwroot\readbug.asp
四.异常捕捉(此处只作大概说明,具体留给你自己实作)
try
{
}
catch(...)
{
Sav_BugInfo( __FILE__, __LINE__, "void test()" );
}
或是把try、catch定义成两个宏方便点。同时我们应该自己定义一个assert
宏,当断言不成立时同样保存相关信息再抛出,以便上一层
(如果有的话)接住再抛, 这样就可以把相关堆栈信息保存下来。
五.bug提交
1. 在开始-运行-输入cmd回车进入虚拟dos下打ipconfig看看ip地址(假设是:192.168.4.25)
2. 在ie下输入http://192.168.4.25/bugreport.htm回车即可看到一文本框,输入信息点确定。
此时再打开
3. c:\bugreport.exe
附:
1. bugreport.htm的内容:
<html>
<head><title> a sample form </title></head>
<FORM METHOD=" OST" ACTION="readbug.asp"><P>
内容:<P>
<TEXTAREA NAME="bug" ROWS=20 COLS=72></TEXTAREA><P>
<CENTER><INPUT TYPE=SUBMIT VALUE="发布信息">
<INPUT TYPE=RESET VALUE="清除信息"></CENTER>
</FORM>
</body>
</html>
2. bugreport.exe的内容
//
#include <windows.h>
#include <stdio.h>
#include <Wininet.h>
#pragma comment(lib, "wininet.lib")
bool SendHttpData( const char * szIP, const char* szFile, const void* szData, int nLen )
{
HINTERNET hInter1 = NULL, hInter2 = NULL, hInter3 = NULL;
// open internet:
hInter1 = InternetOpen( "", 0, NULL, NULL, 0 );
if( !hInter1 ) return false;
// open url:
hInter2 = InternetConnect( hInter1, szIP, 80, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1 );
if( !hInter2 )
{
InternetCloseHandle(hInter1);
return false;
}
// open request:
hInter3 = HttpOpenRequest( hInter2, "POST", szFile, NULL, NULL, NULL, INTERNET_FLAG_EXISTING_CONNECT | INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE, 1 );
if( !hInter3 )
{
InternetCloseHandle(hInter2);
InternetCloseHandle(hInter1);
return false;
}
// send:
char szHeader[] = "Accept:*/*\r\n""Content-Type:application/x-www-form-urlencoded\r\n";
int nRes = HttpSendRequest( hInter3, szHeader, strlen(szHeader), (void*)szData, nLen ) ;
if( 0 != nRes )
{
const int BUFFSIZE = 512;
char pcBuffer[BUFFSIZE];
DWORD dwBytesRead;
printf("\nThe following was returned by the server:\n");
do
{ dwBytesRead=0;
if( InternetReadFile ( hInter3, pcBuffer, BUFFSIZE-1, &dwBytesRead ) )
{
pcBuffer[dwBytesRead] = 0x00; // Null-terminate buffer
printf( "%s", pcBuffer );
}
else
printf( "\nInternetReadFile failed" );
}while( dwBytesRead > 0 );
printf( "\n" );
}
// close all:
InternetCloseHandle( hInter3 );
InternetCloseHandle( hInter2 );
InternetCloseHandle( hInter1 );
system( "pause" );
return (0 != nRes);
}
int main(int argc, char *argv[])
{
char szIp[] = "192.168.4.25";
char szFile[] = "Readbug.asp";
char szData[] = "bug=test only\n";
int nLen = strlen(szData);
SendHttpData( szIp, szFile, szData, nLen );
return 0;
}
3. Readbug.asp的内容:
<%@ LANGUAGE="VBSCRIPT" %>
<%
'Increase Script Timeout to 10 hours(36000minute), default timeout is 20 minutes
Server.ScriptTimeout = 36000
bug = Request.FORM( "bug" )
set fsFilesys=CreateObject( "Scripting.FileSystemObject" )
bugfile = "c:\bug.txt"
bug = bug & "[" & Now & "]"
if fsFilesys.FileExists( bugfile ) then
Set tsCoffee=fsFilesys.OpenTextFile( bugfile, 8 )
else
set tsCoffee=fsFilesys.CreateTextFile( bugfile, true )
end if
tsCoffee.WriteLine( bug )
tsCoffee.Close
' Send results back to client
Response.Write " bytes were read."
%>
注:
bugreport.htm中的FORM下的name对应就是我们在 Readbug.asp中的"bug"
而bugreport.exe中的char szData[] = "bug=test only\n"中的bug也是
对应Readbug.asp中的"bug"。如果有必要可以使用多个,在Readbug.asp
再存进数据库中。
这里要感谢一下xum大哥,我最初是从他那里大体上知道这个方法的。
|
|