游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2077|回复: 2

bug reprot process

[复制链接]

100

主题

224

帖子

238

积分

中级会员

Rank: 3Rank: 3

积分
238
发表于 2004-9-17 16:13:00 | 显示全部楼层 |阅读模式
有没有发现一些程序在出错时会弹出一个输入框供提交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=&quotOST" 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大哥,我最初是从他那里大体上知道这个方法的。





90

主题

797

帖子

833

积分

高级会员

论坛版主

Rank: 4

积分
833
QQ
发表于 2004-9-20 19:28:00 | 显示全部楼层

Re:bug reprot process

很不错的文章,怎么没人回呢?

100

主题

224

帖子

238

积分

中级会员

Rank: 3Rank: 3

积分
238
 楼主| 发表于 2004-9-21 12:13:00 | 显示全部楼层

Re:bug reprot process

谢谢

更正:
三.网站接收程序(具体内容付带后面):
  C:\Inetpub\wwwroot\readbug.htm
已修正为:
  C:\Inetpub\wwwroot\readbug.asp
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-8-18 17:35

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表