快速开始
比纯调试器调试工程. 一般步骤是:
1) 设置bdenug.ini
2) 开启比纯调试器
3) F2热键
4) build命令编译工程
5) F3热键
6)运行工程
7) 工程抛出例外(崩溃 , 无限循环 , 未知结果 ......)
8) F2 热键
9) 输入一些调试命令以定位错误代码
10) 发现bug原因
11) 修改代码并再次尝试运行
12) 无bug发现, 用shutdown命令退出比纯调试器
最重要的命令是 "build". 您能使用比纯调试器 "build"命令成功编译工程, 您就能用比纯调试器调试之.
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
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原因为野指针所致.
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++;
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, 否则比纯调试器将抛出错误. 比纯调试器不能同时调试两个模块.
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) 此简单错误请您尝试纠正.
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) 请尝试纠正错误.
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() 未调用.
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
确信您已经安装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()发送至比纯调试器的消息串.
确信您已经安装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
该例子依赖于您的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查看代码运行现场.
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修改他们.