回答一下关于BBED的两个问题

| No Comments

今天有朋友问了我两个关于BBED的问题,我这里回答一下。

 

1BBED不能够正常make,报如下错误:

ld: 0706-006 Cannot find or open library file: -l m

        ld:open(): A file or directory in the path name does not exist.

ld: 0706-006 Cannot find or open library file: -l m

        ld:open(): A file or directory in the path name does not exist.

ld: 0706-006 Cannot find or open library file: -l m

        ld:open(): A file or directory in the path name does not exist.

make: 1254-004 The error code from the last command is 255.

为什么会这样?

这是因为缺少bos.adt.libm,如下所示:

$ lslpp -l | grep bos.adt

  bos.adt.base              5.3.0.51  COMMITTED  Base Application Development

  bos.adt.include           5.3.0.51  COMMITTED  Base Application Development

  bos.adt.lib               5.3.0.50  COMMITTED  Base Application Development

 

正常情况下应该这样:

$ lslpp -l | grep bos.adt

  bos.adt.base              5.3.0.51  APPLIED    Base Application Development

  bos.adt.debug             5.3.0.50  COMMITTED  Base Application Development

  bos.adt.graphics          5.3.0.50  COMMITTED  Base Application Development

  bos.adt.include           5.3.0.51  APPLIED    Base Application Development

  bos.adt.insttools         5.3.0.50  COMMITTED  Tool to Create installp

  bos.adt.lib               5.3.0.50  COMMITTED  Base Application Development

  bos.adt.libm              5.3.0.40  COMMITTED  Base Application Development

  bos.adt.libmio             5.3.0.0  COMMITTED  Modular IO Library

  bos.adt.prof              5.3.0.53  COMMITTED  Base Profiling Support

  bos.adt.prt_tools          5.3.0.0  COMMITTED  Printer Support Development

  bos.adt.samples           5.3.0.40  COMMITTED  Base Operating System Samples

  bos.adt.sccs              5.3.0.50  COMMITTED  SCCS Application Development

  bos.adt.syscalls          5.3.0.50  COMMITTED  System Calls Application

  bos.adt.utils             5.3.0.50  COMMITTED  Base Application Development

  bos.adt.data               5.3.0.0  COMMITTED  Base Application Development

 

2BBED里怎样在不看trace文件的情况下知道某一行的offset,或者说定位到这一行?

:有两种方法,我们来举一个实例:

SQL> select owner,object_name,dbms_rowid.rowid_relative_fno(rowid)||'_'||dbms_rowid.rowid_block_number(rowid) location from sys.testlmttb where rownum<6;

 

OWNER        OBJECT_NAME                           LOCATION

-------           ------------------------------------               -----------------------

SYS        /1005bd30_LnkdConstant                       138_13

SYS        /10076b23_OraCustomDatumClosur        138_13

SYS        /10297c91_SAXAttrList                          138_13

SYS        /103a2e73_DefaultEditorKitEndP          138_13

SYS        /1048734f_DefaultFolder                         138_13

 

现在我要在不看dump文件的前提下通过BBED找到上述select结果中的那条蓝色的记录,这条蓝色的记录是第4行。

 

方法1、直接find

SQL> select dump('/103a2e73_DefaultEditorKitEndP',16) from dual;

 

DUMP('/103A2E73_DEFAULTEDITORK

--------------------------------------------------------------------------------

Typ=96 Len=30: 2f,31,30,33,61,32,65,37,33,5f,44,65,66,61,75,6c,74,45,64,69,74,6f,72,4b,69,74,45,6e,64,50

 

所以这里我们直接find字符串2f31303361326537335f44656661756c74456469746f724b6974456e6450

 

BBED> set dba 138,13

        DBA             0x2280000d (578813965 138,13)

 

BBED> find /x 2f31303361326537335f44656661756c74456469746f724b6974456e6450 TOP

 File: /dras20/astca/testlmt01.dbf (138)

 Block: 13               Offsets: 7798 to 8191           Dba:0x2280000d

------------------------------------------------------------------------

 2f313033 61326537 335f4465 6661756c 74456469 746f724b 6974456e 6450ff04

 c3022a64 ff0a4a41 56412043 4c415353 07786a06 13043221 07786a06 13043221

 13323030 362d3036 2d31393a 30333a34 393a3332 0556414c 4944014e 014e014e

 2c000d03 53595315 2f313032 39376339 315f5341 58417474 724c6973 74ff04c3

 032233ff 0a4a4156 4120434c 41535307 786a0613 04331c07 786a0613 04342f13

 32303036 2d30362d 31393a30 333a3530 3a323705 56414c49 44014e01 4e014e2c

 000d0353 59531e2f 31303037 36623233 5f4f7261 43757374 6f6d4461 74756d43

 6c6f7375 72ff03c2 4c24ff0a 4a415641 20434c41 53530778 6a061304 320a0778

 6a061304 320a1332 3030362d 30362d31 393a3033 3a34393a 30390556 414c4944

 014e014e 014e2c00 0d035359 53162f31 30303562 6433305f 4c6e6b64 436f6e73

 74616e74 ff04c302 500eff0a 4a415641 20434c41 53530778 6a061304 322e0778

 6a061304 322e1332 3030362d 30362d31 393a3033 3a34393a 34350556 414c4944

 014e014e 014ec78d 0601

 

 <32 bytes per line>

 

这里的offset7798,很容易计算出这一行的行头的offset7790

 

方法2、用kdbr结构定位offset

上述这条蓝色的记录是第4行,所以这条记录在这个block里的row directory对应的就是kdbr[3]

BBED> set offset *kdbr[3]

        OFFSET          7790

 

BBED> dump

 File: /dras20/astca/testlmt01.dbf (138)

 Block: 13               Offsets: 7790 to 8191           Dba:0x2280000d

------------------------------------------------------------------------

 2c000d03 5359531e 2f313033 61326537 335f4465 6661756c 74456469 746f724b

 6974456e 6450ff04 c3022a64 ff0a4a41 56412043 4c415353 07786a06 13043221

 07786a06 13043221 13323030 362d3036 2d31393a 30333a34 393a3332 0556414c

 4944014e 014e014e 2c000d03 53595315 2f313032 39376339 315f5341 58417474

 724c6973 74ff04c3 032233ff 0a4a4156 4120434c 41535307 786a0613 04331c07

 786a0613 04342f13 32303036 2d30362d 31393a30 333a3530 3a323705 56414c49

 44014e01 4e014e2c 000d0353 59531e2f 31303037 36623233 5f4f7261 43757374

 6f6d4461 74756d43 6c6f7375 72ff03c2 4c24ff0a 4a415641 20434c41 53530778

 6a061304 320a0778 6a061304 320a1332 3030362d 30362d31 393a3033 3a34393a

 30390556 414c4944 014e014e 014e2c00 0d035359 53162f31 30303562 6433305f

 4c6e6b64 436f6e73 74616e74 ff04c302 500eff0a 4a415641 20434c41 53530778

 6a061304 322e0778 6a061304 322e1332 3030362d 30362d31 393a3033 3a34393a

 34350556 414c4944 014e014e 014ec78d 0601

 

 <32 bytes per line>

 

BBED> x /r

rowdata[6681]                               @7790   

-------------

flag@7790: 0x2c (KDRHFL, KDRHFF, KDRHFH)

lock@7791: 0x00

cols@7792:   13

 

col    0[3] @7793:  0x53  0x59  0x53

col   1[30] @7797:  0x2f  0x31  0x30  0x33  0x61  0x32  0x65  0x37  0x33  0x5f

 0x44  0x65  0x66  0x61  0x75  0x6c  0x74  0x45  0x64  0x69  0x74  0x6f  0x72

 0x4b  0x69  0x74  0x45  0x6e  0x64  0x50

col    2[0] @7828: *NULL*

col    3[4] @7829:  0xc3  0x02  0x2a  0x64

col    4[0] @7834: *NULL*

col   5[10] @7835:  0x4a  0x41  0x56  0x41  0x20  0x43  0x4c  0x41  0x53  0x53

 

col    6[7] @7846:  0x78  0x6a  0x06  0x13  0x04  0x32  0x21

col    7[7] @7854:  0x78  0x6a  0x06  0x13  0x04  0x32  0x21

col   8[19] @7862:  0x32  0x30  0x30  0x36  0x2d  0x30  0x36  0x2d  0x31  0x39

 0x3a  0x30  0x33  0x3a  0x34  0x39  0x3a  0x33  0x32

col    9[5] @7882:  0x56  0x41  0x4c  0x49  0x44

col   10[1] @7888:  0x4e

col   11[1] @7890:  0x4e

col   12[1] @7892:  0x4e

从结果里我们可以看到,上述行的行头的offset确实是7790

 

我发现好像有不少朋友都对BBED很感兴趣,其实我觉得BBED真没什么,就是一个工具而已,用ultraEdit+dd往往可以达到同样的目的(当然,会麻烦一些)。

 

用好BBED的关键就是要了解Block的结构。

 

朋友们,能从上面的结果中看出oracle中的nullblock里会存成什么吗?

Leave a comment