快速开始

 返回

 

   比纯调试器调试工程.  一般步骤是:

   1) 设置bdenug.ini

   2) 开启比纯调试器

   3) F2热键

   4) build命令编译工程

   5) F3热键

   6)运行工程

   7) 工程抛出例外(崩溃 , 无限循环 , 未知结果 ......)

   8) F2 热键

   9) 输入一些调试命令以定位错误代码

   10) 发现bug原因 

   11) 修改代码并再次尝试运行

   12) 无bug发现, 用shutdown命令退出比纯调试器

      

    最重要的命令是 "build". 您能使用比纯调试器 "build"命令成功编译工程, 您就能用比纯调试器调试之. 

 

Windows helloworld

1) demo目录: demo\win\helloworld. 

2)启动比纯调试器.

          启动bdee.exe( 企业版需要BTRserver端 , 免费版不需此步骤 )

          启动bd.exe

3)build命令编译demo

          F2 

          build d:\BTR\demo\win\helloworld

          F3

4) 启动helloworld.exe

          cd d:\BTR\demo\win\helloworld\debug

          helloworld.exe

5)  程序崩溃.

6) 在bd.exe命令提示符下

          F2

          flash -s a.txt

7)使用写字板打开 d:\BTR\client\a.txt或者d:\比纯调试器\a.txt

8)  最后代码停在: *q++ = *p++;.

9) 分析 bug原因.

10) 修改代码 *q++ = *p++; ==> *p++ = *q++;

11) build命令再次编译helloword 

          build d:\比纯调试器\demo\win\helloworld
          F3

12)再次运行helloworld.exe 

13) Helloworld.exe再次崩溃 

14) 在bd.exe命令提示符下

          F2

          flash -s a.txt

15) 读取a.txt并分析bug原因.

16) 修改代码 :

          char buf[ 5 ];  =>  char buf[ 20 ];

         在printf("%s" , buf );之前插入 *q = 0;

17) build命令编译并运行helloworld.exe , 没有bug发现.

          build d:\BTR\demo\win\helloworld
          F3


18) 退出比纯调试器( exit bd.exe )

          F2

          shutdown

19) 当all 比纯调试器client端 are 关闭 , shutdown 比纯调试器 server.

          To bdee.exe( 企业版):

          shutdown

    

 

Windows hellowindow

1)demo目录: demo\win\hellowindow. 

2)build命令编译  工程并运行demo\win\hellowindow\Debug\hellowindow.exe

3)当hellowindow.exe崩溃 

          F2

          flash -s a.txt 

4)因为hellowindow.exe是多线程进程,使用筛选查看更清楚:

          flash hellowindowview.cpp -s b.txt

5)发现bug原因为野指针所致.

 

 

 

Windows library

1)demo目录: demo\win\tstl and demo\win\tstl\usel.  tstl工程创建库. usel工程调用库tstl.lib. 

2)使用比纯调试器build命令编译 demo\win\tstl 工程

3)使用microsoft visual c++ 编译链接 demo\win\tstl\usel 

4)运行demo\win\tstl\usel\Debug\usel.exe.  进程无响应.

5)使用flash命令发现进程处于无限循环中.

          F2

          flash -s a.txt

6)发现bug原因, 指针没有移动. 增加

          p++;

 

 

Windows dll

1)demo目录: demo\win\tstdll and demo\win\tstdll\usedll.  tstdll是dll工程. usedll工程调用tstdll.dll. 

2)使用比纯调试器build命令编译demo\win\tstdll工程

3)使用microsoft visual c++编译链接demo\win\usedll 

4)运行demo\win\tstdll\usedll\Debug\usedll.exe.  进程崩溃.

5)使用flash命令发现dll已经载入 , 但是函数没有调用dll.

       F2

       flash -s a.txt

6)发现bug原因为dll函数指针错了.修改:

       DEFFUNC pFunc;

       pFunc = ( DEFFUNC )( dll_load.GetDll函数( dll_handle ,"fntstdll") );

       x = ( *pFunc )( atoi( str ) );

 

7)顺便告之, 您也可调试usedll工程. 注意bdebug.ini增加:

       [PV_FUNCTION]
       ( DllLoad , DllUnload )

  a) bd.exe

  b)运行usedll.exe , usedll.exe结束

  c) in bd.exe ,使用F2热键暂停. 观察pv函数 

       pv

       resource:10000000 [usedllDlg.cpp:00186] dll_handle = dll_load.DllLoad( "..\\..\\Debug\\tstdll.dll" );

       1 unfree pointers.

  d) dll_handle视为指针. dll_handle在整个 进程期间未释放. 因此增加代码行:

       dll_load.DllUnload( dll_handle );

8) 当您调试usedll工程. 我们抱歉地提醒您必须使用vc++ 编译链接tstdll工程, 然后运行usedll.exe, 否则比纯调试器将抛出错误.  比纯调试器不能同时调试两个模块.     

 

Linux helloWorld

1) demo目录: demo/linux/helloworld

2) makefile,   simplist makefile demo . Include make clean and make , 没有 bdebug.ini文件.

3) build命令编译

       cd /home/usr/BTR

       ./bd.exe

       F2

       build /home/usr/BTR/linux/helloworld

       F3

4)运行 

       cd /home/usr/BTR/demo/linux/helloworld/release

       ./helloworld.exe

        程序崩溃 

5) flash命令查看崩溃行.

       F2

       flash -s a.txt

       /home/usr/BTR/a.txt 

       ...

6)  错误行是:

       [main.cpp : 00016 ]   delete( pCMyHost );

7) 此简单错误请您尝试纠正.

 

 

Linux echo

1)demo目录: demo/linux/echo

2)makefile,  like demo/linux/helloworld/makefile.

3)使用比纯调试器build命令编译  工程

       cd /home/usr/BTR

       ./bd.exe

       F2

       build /home/usr/BTR/linux/echo

       F3

4)运行echo.exe

       cd /home/usr/BTR/demo/linux/echo/release

       ./echo.exe

       input send string(问: quit):

       Q

5)使用pv命令查看内存泄漏

       F2

       pv

       There are one pointer unreleased:

       [echosrv.cpp : 00083] m_pCTcp = new CTcp();

6) 请尝试纠正错误.

 

 

Linux lib & dll

1) demo目录: 

       demo/linux/mylib

       demo/linux/mydll

       demo/linux/myexe

       工程 myexe调用mylib静态库和mydll动态库.

2)Make them.

3)首先调试mylib

       ./bd.exe

       F2

       build /home/usr/BTR/linux/mylib

       F3

4) 修改myexe makefile , 增加-lpthread 和 -lrt. 然后make. 不要使用build命令编译my.exe.

5)运行/home/usr/BTR/linux/myexe/my.exe

       ./my.exe

       进程崩溃 .

6)使用flash命令在bd.exe终端

       F2

       flash -s a.txt

       打开a.txt查看知错误是 

       [mycp.cpp : 00019] while( *q ) *q++ = *p++;

       纠正错误并make. 不要使用build命令编译my.exe.

7) 第二步调试myexe. 在其bdebug.ini增加[PV_FUNCTION]

    ( DllLoad , DllUnload ) , 然后build命令编译 myexe 工程.

       build /home/usr/BTR/linux/myexe

       F3

8)运行my.exe

       ./my.exe

      input number:3    

       Library copy result=3

       Call dll , segma( 3 ) = 6

9) 比纯调试器抛出一个错误.

       错误20011: [pointer:0 ] wild pointer.

        line is:

       [main.cpp:00053] delete ( pCMyCP );

       忽略错误报告,使用F3热键继续

       F3    

        进程退出.

10)使用pv查看资源管理bug.

       F2

       pv

       resource:09c990f0 [main.cpp:00042] handle = pCDllLoad->DllLoad( "../mydll/segma.因此" );

       1 unfree pointers.

        错误显示 DllUnload() 未调用.

 

Linux KDE form

1)  demo目录: demo/linux/TheApp1

2) 使用linux KDE/c++ IDE 创建一工程名为theapp1

3) 增加按钮及标签, 增加事件代码. 尝试运行.

4) 退出KDE ,运行./设置 , make , make distclean.

  cd demo/linux/TheApp1
  ./设置
  make clean
  make

5) 确信工程运行正常. 

6) 比纯调试器build命令编译 KDE工程

     ./bd.exe
    F2
    build /home/usr/BTR/linux/TheApp1
    F3

7) 双击exe文件:

    demo/linux/TheApp1/src/theapp1

8)使用比纯调试器命令跟踪进程.

     F2
     flash -s a.txt
     func -s b.txt
     lon
     F3
     ...
     F2
     clog -s c.txt
     loff
     F3

 

 

Java HelloWorld

 

   确信您已经安装JDK ;确信您已经运行比纯调试器 jshell\java_setup.bat; 确信您已经在CLASSPATH中追加%JAVA_HOME%\jre\lib\ext\jni.jar

1)  demo目录: demo\win\javahello

  使用eclipse(或其它工具)生成一工程. eclipse将*.java与*.class放入不同路径. 此处*.java与*.class处理相同路径.

2) 创建make.bat

3) 设置bdebug.ini

4) build命令编译 demo\win\javahello

   bd >

   F2

   build命令编译 demo\win\javahello

   F3

5)运行java

   cd   demo\win\javahello\top

   java -jar f1.jar

6) See java 正在运行代码日志.

   F2

   flash -s a.txt

7) 在代码中增加比纯调试器输出调试消息 API . 函数 bprint() 定义在jni\bdg.java中. 

   bdg.bprint( "test x+y" );

   bdg.bprint( s );

   如以后不使用比纯调试器, 请删除bdg.bprint()代码行, 否则将导致错误.

8) build命令再次编译demo\win\javahello ,再次运行java

9) 观察bdg.bprint()发送至比纯调试器的消息串.

 

 

Java Servlet

  确信您已经安装J2EE.

1)  demo目录: demo\win\servlet

2) 创建make.bat

3) 设置bdebug.ini

 *.java 映射 其 *.class 路径必须在bdebug.ini中指定

[JAVA_PKGMAP]
...\demo\win\servlet\src : ...\demo\win\servlet\test\WEB-INF\classes

4) build命令编译 

   bd >

   F2

   build命令编译 demo\win\servlet

   F3

5) 启动tomcat , 布署servlet.

    您可启动tomcat , websphere或者weblogical,或者其他第三方产品. 如果TestServlet.war布署成功 , 然后您可使用比纯调试器调试了.

   

6)使用IE浏览器 , 输入 url:

http://127.0.0.1:8080/TestServlet

 

7)在比纯调试器窗口使用flash命令, 查阅servlet代码运行现场.

   F2

   flash 

 

 

 

JavaBean

    该例子依赖于您的javaweb是何种安装. 例子中C:\apache-tomcat-7.0.23\webapps\examples\WEB-INF\classes\jsp2\examples是一个javabean.

     1)复制demo\win\JavaBean\bdebug.ini、make.bat到C:\apache-tomcat-7.0.23\webapps\examples\WEB-INF\classes\jsp2\examples之下

     2)使用比纯调试器build编译命令

     bd >

     F2

     build C:\apache-tomcat-7.0.23\webapps\examples\WEB-INF\classes\jsp2\examples

     F3

     3)启动tomcat

     4)在IE里, 输入URL:

     http://127.0.0.1:8080/index --> JSP 例子

     5)使用比纯调试器查看正在运行的java bean.

     F2

     flash -s a.txt

     6)打开a.txt查看代码运行现场.

C#

     

1)demo目录: demo\win\cs. 

2)请参阅设置帮助,在 debug.ini文件里如何设置C#工程编译参数. 

3)build命令编译demo

 bd >

 F2

 build ...\demo\win\cs

 F3

4)运行c# 工程.

 双击demo\win\cs\obj\Debug\cs.exe.一C#窗体显示.

5)使用比纯调试器,查看代码运行现场:

 F2

 flash -s a.txt

 

问与答

 

 源码序列:

  1) if ( b )

  问: 为什么 "[00016][x.cpp]if ( b ) goto LABEL_EXIT;" 出现两次?

  答: [00016][x.cpp]if ( b ) goto LABEL_EXIT;

       [00016][x.cpp]if ( b ) goto LABEL_EXIT;

       正确 , 因为b == true. 

  2) 线程崩溃

  问:以下代码日志:

       [00016][x.cpp] x = 1;
       [00260][x.cpp] x += strlen( s );
       [05012][y.cpp] while( bOk ) {
       [05013][y.cpp] Sleep( 300 );
       [05013][y.cpp] Sleep( 300 );
        ...
       [05013][y.cpp] Sleep( 300 );

      哪一行代码崩溃?

  答: "[00260][x.cpp] x += strlen( s ); "崩溃 . 因为x.cpp运行在线程A. y.cpp运行在线程B. [00260][x.cpp]语句本身不会退出函数体之外,但是却没有接下来的语句. 因此strlen( s )是崩溃行.

  3)崩溃在 int x = 0;

  问:以下代码日志:

       [00906][x.cpp] pCSegma->segma( num ) ;

       [01509][segma.cpp] int x = 0;

        进程崩溃在代码行[01509][segma.cpp] , 为什么 ?

  答: 因为pCSegma是野指针. 有时pCSegma的地址不会引起崩溃, 但因为没有内存分配给pCSegma. 您应该检查代码中是否有  "pCSegma = new ..."这样的语句出现.

 

Value Trace

   1) value log

    [00055][x.cpp] bwatch( "NUM" , &num , 4 );
    NUM: 00 00 00 00 [int]=0 [uint]=0
    [01026][y.cpp] num++;
    NUM: 01 00 00 00 [int]=1 [uint]=1
    [01026][y.cpp] num++;
    NUM: 02 00 00 00 [int]=2 [uint]=2
    [03016][x.cpp] num--;
    NUM: 01 00 00 00 [int]=1 [uint]=1
    [03062][z.cpp]    pPersonItem->sex = MAN;
    NUM: 5B 00 00 00 [int]=91 [uint]=91
    [03016][x.cpp] num--;
    NUM: 5A 00 00 00 [int]=90 [uint]=90

   问: 代码行[03062][z.cpp] 改变了变量num的值 , 为什么?

   答: 因为pPersonItem是野指针 .  变量 sex地址与变量num地址相同 , 因此值num改变.

VC demo 

 1) build命令编译失败

 问: 我复制demo工程到我的硬盘 , 我不能用build命令编译一些 VC 工程, 为什么?

 答: 请首先在visual studio集成环境中编译成功 . 因为visual studio环境改变了, 输出路径改变了.然后再用比纯调试器编译。定能成功。

KDE demo 

 1) build命令编译失败

 问: 我复制 demo工程到我的 硬盘 , 我 不能用build命令编译, 为什么?

 答: 请再次在 您的linux中创建KDE工程 . 然后使用命令./configure, make clean, make , make distclean 逐个手动检查 是否成功. 然后再尝试用比纯调试器编译.

顺便告之 , 您可尝试其它x-window界面IDE工具. 生成Makefile并尝试使用比纯调试器build命令编译这些工程.

 2) build命令编译失败

 问:我不能build命令编译  KDE窗体demo例子 , 为什么?

 答:请检查是否您的linux已经安装KDE. 无KDE的库支持也不能成功.

 

BTRweb

 1)字符乱码

 问:我使用BTRweb , 有时我发现字符乱码 , 为什么? 

 答:请设置为UTF字符集.

 2)c#

 问:我使用BTRweb浏览test.cs代码文件, 我发现字符乱码.

 答:因为在 *.cs文件中开始3字节(0xEF 0xBB 0xBF)是微软c#文件标识. 因此字符乱码. IE或者firefox不能识别这些字符. 

因此您可浏览c#文件 , 但是不能使用BTRweb.exe修改他们.