环境:SunOS 5.9
Tuxedo 9.1
Sun Stido 12
C++
第一步:完成服务端的编写和编译,连接。
可以使用makefile来做,如果懒得用makefile来做的话,可以这样
>vi $HOME/.profile
修改其中的CC,使其为‘CC -compat -g’ -g表示指示编译在编译期间生成调试信息,否则就不能在dbx中看到源代码
>./.profile
使上面的修改生效,如果没有权限,则可以退出当前session,再重进一下就可以
>buildserver -f yourserver.cpp -s YOURSERVER -o YOURSERVER
这样就能生成带有调试信息的可执行文件
第二步:服务ONLINE
>tmshutdown -s YOURSERVER
>tmboot -s YOURSERVER
上面的操作只会关掉你的服务,对同一个tuxedo内的其他的服务没有影响。
如果上面的操作不能成功,可以清除ipc资源(注意,这样整个tuxedo就关掉了,需要慎重)
>tmipcrm
>tmboot
第三步:得到进程号
查看进程号(PID号)
>ps -e |grep YOURSERV
注意上面是'YOURSERV'而不是'YOURSERVER',因为ps显示进程名时,会自动截断为8个字符
从上面中找到你的服务的进程号,假设为12319
第四步:进行调试
>dbx
>attach 12319 dbx到程序进程,连接完成后,程序就停止运行
>file yourserver.cpp (这一步必须有,否则,你看不到自己的代码)
>list (显示程序代码)
>stop at 123 (设置断点在123行)
>cont (运行程序,attach命令后,程序就停止运行,在客户端发送服务请求前,用 cont使程序开始运行)
客户端发起服务请求,可以看到如下内容,这表示程序已经在123行这个断点处停下了
t@1 (l@1) stopped in YOURSERVER at line 120 in file "yourserver.cpp"
123 unsigned char *bfr = (unsigned char*)rqst->data;
在dbx中就可以看到,服务端程序停在123行
>print len len为变量,下面能看到len的值,编码为10进制编码
len = 1036
>print p p为指针, 0x66037为input的值,“C”为p所指向内容的值,也就是*p
p = 0x66037 "C"
>print input[0..4:2] input为数组或者指向数组的指针,输出0到4之间的元素,间隔为2,也可以input[0..4],输出所有元素
input[0..4:2] =
[0] = '/0'
[2] = ';'
[4] = 'A'
>next 进入下一步,如果当前位置是一个方法,不会进入方法中,而是执行完方法,然后进入下一行
>step 进入下一行代码,如果当前位置有方法调用,会进入方法中进行调试
>cont 已经得到所有信息,让服务程序继续运行,如果后面还有客户端发起请求,则还会在前面设置的断点处停止
>detach 接触dbx与服务程序程序的连接。