2003-04-01 02:12:46 +08:00
|
|
|
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
|
|
|
* Copyright by the Board of Trustees of the University of Illinois. *
|
|
|
|
|
* All rights reserved. *
|
|
|
|
|
* *
|
|
|
|
|
* This file is part of HDF5. The full HDF5 copyright notice, including *
|
|
|
|
|
* terms governing use, modification, and redistribution, is contained in *
|
|
|
|
|
* the files COPYING and Copyright.html. COPYING can be found at the root *
|
|
|
|
|
* of the source code distribution tree; Copyright.html can be found at the *
|
|
|
|
|
* root level of an installed copy of the electronic HDF5 document set and *
|
|
|
|
|
* is linked from the top-level documents page. It can also be found at *
|
|
|
|
|
* http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have *
|
|
|
|
|
* access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. *
|
|
|
|
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
|
|
|
|
|
2001-02-23 05:49:40 +08:00
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
*
|
|
|
|
|
* Created: debug.c
|
|
|
|
|
* Jul 18 1997
|
|
|
|
|
* Robb Matzke <matzke@llnl.gov>
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Debugs an existing HDF5 file at a low level.
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
#define H5F_PACKAGE /*suppress error about including H5Fpkg */
|
2003-02-17 23:54:15 +08:00
|
|
|
|
#define H5O_PACKAGE /*suppress error about including H5Opkg */
|
2005-02-04 03:59:05 +08:00
|
|
|
|
#define H5B2_PACKAGE /*suppress error about including H5B2pkg */
|
2005-02-08 09:03:48 +08:00
|
|
|
|
#define H5B2_TESTING /*suppress warning about H5B2 testing funcs*/
|
2005-03-11 08:44:03 +08:00
|
|
|
|
#define H5BT_PACKAGE /*suppress error about including H5BTpkg */
|
2005-03-30 05:45:09 +08:00
|
|
|
|
#define H5SH_PACKAGE /*suppress error about including H5SHpkg */
|
2001-02-23 05:49:40 +08:00
|
|
|
|
|
2005-02-04 03:59:05 +08:00
|
|
|
|
#include "H5private.h" /* Generic Functions */
|
2001-04-04 01:48:52 +08:00
|
|
|
|
#include "H5Bprivate.h"
|
2005-02-04 03:59:05 +08:00
|
|
|
|
#include "H5B2pkg.h" /* B-trees */
|
2005-03-11 08:44:03 +08:00
|
|
|
|
#include "H5BTpkg.h" /* Block tracker */
|
2004-06-06 03:06:24 +08:00
|
|
|
|
#include "H5Dprivate.h"
|
2001-04-04 01:48:52 +08:00
|
|
|
|
#include "H5Fpkg.h"
|
|
|
|
|
#include "H5Gprivate.h"
|
|
|
|
|
#include "H5HGprivate.h"
|
|
|
|
|
#include "H5HLprivate.h"
|
2003-07-10 02:14:29 +08:00
|
|
|
|
#include "H5Iprivate.h"
|
2003-02-17 23:54:15 +08:00
|
|
|
|
#include "H5Opkg.h"
|
2003-07-10 02:14:29 +08:00
|
|
|
|
#include "H5Pprivate.h"
|
2005-03-30 05:45:09 +08:00
|
|
|
|
#include "H5SHpkg.h" /* Segmented heap */
|
2001-02-23 05:49:40 +08:00
|
|
|
|
|
|
|
|
|
/* File drivers */
|
2001-04-04 01:48:52 +08:00
|
|
|
|
#include "H5FDfamily.h"
|
2001-02-23 05:49:40 +08:00
|
|
|
|
|
|
|
|
|
#define INDENT 3
|
|
|
|
|
#define VCOL 50
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: main
|
|
|
|
|
*
|
|
|
|
|
* Usage: debug FILENAME [OFFSET]
|
|
|
|
|
*
|
|
|
|
|
* Return: Success: exit (0)
|
|
|
|
|
*
|
|
|
|
|
* Failure: exit (non-zero)
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* matzke@llnl.gov
|
|
|
|
|
* Jul 18 1997
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
int
|
|
|
|
|
main(int argc, char *argv[])
|
|
|
|
|
{
|
2003-03-22 22:53:27 +08:00
|
|
|
|
hid_t fid, fapl, dxpl;
|
2001-02-23 05:49:40 +08:00
|
|
|
|
H5F_t *f;
|
2005-02-08 09:03:48 +08:00
|
|
|
|
haddr_t addr=0, extra=0, extra2=0;
|
2001-02-23 05:49:40 +08:00
|
|
|
|
uint8_t sig[16];
|
2004-12-29 22:26:20 +08:00
|
|
|
|
int i;
|
2001-02-23 05:49:40 +08:00
|
|
|
|
herr_t status = SUCCEED;
|
|
|
|
|
|
|
|
|
|
if (argc == 1) {
|
|
|
|
|
fprintf(stderr,
|
2005-02-04 03:59:05 +08:00
|
|
|
|
"Usage: %s filename [signature-addr [extra]]\n", argv[0]);
|
2001-02-23 05:49:40 +08:00
|
|
|
|
HDexit(1);
|
|
|
|
|
}
|
|
|
|
|
|
2003-03-22 22:53:27 +08:00
|
|
|
|
/* Initialize the library */
|
|
|
|
|
if(H5open ()<0) {
|
|
|
|
|
fprintf(stderr, "cannot initialize the library\n");
|
|
|
|
|
HDexit(1);
|
|
|
|
|
}
|
|
|
|
|
|
2001-02-23 05:49:40 +08:00
|
|
|
|
/*
|
|
|
|
|
* Open the file and get the file descriptor.
|
|
|
|
|
*/
|
2003-03-22 22:53:27 +08:00
|
|
|
|
if((dxpl = H5Pcreate (H5P_DATASET_XFER))<0) {
|
|
|
|
|
fprintf(stderr, "cannot create dataset transfer property list\n");
|
|
|
|
|
HDexit(1);
|
|
|
|
|
}
|
|
|
|
|
if((fapl = H5Pcreate (H5P_FILE_ACCESS))<0) {
|
|
|
|
|
fprintf(stderr, "cannot create file access property list\n");
|
|
|
|
|
HDexit(1);
|
|
|
|
|
}
|
2001-02-23 05:49:40 +08:00
|
|
|
|
if (strchr (argv[1], '%')) {
|
2003-03-22 22:53:27 +08:00
|
|
|
|
H5Pset_fapl_family (fapl, (hsize_t)0, H5P_DEFAULT);
|
2001-02-23 05:49:40 +08:00
|
|
|
|
}
|
2003-03-22 22:53:27 +08:00
|
|
|
|
if ((fid = H5Fopen(argv[1], H5F_ACC_RDONLY, fapl)) < 0) {
|
2001-02-23 05:49:40 +08:00
|
|
|
|
fprintf(stderr, "cannot open file\n");
|
|
|
|
|
HDexit(1);
|
|
|
|
|
}
|
|
|
|
|
if (NULL == (f = H5I_object(fid))) {
|
|
|
|
|
fprintf(stderr, "cannot obtain H5F_t pointer\n");
|
|
|
|
|
HDexit(2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Parse command arguments.
|
|
|
|
|
*/
|
|
|
|
|
if (argc > 2) {
|
2005-03-11 08:44:03 +08:00
|
|
|
|
/* printf("New address: %s\n", argv[2]); */
|
2001-02-23 05:49:40 +08:00
|
|
|
|
addr = HDstrtoll(argv[2], NULL, 0);
|
|
|
|
|
}
|
|
|
|
|
if (argc > 3) {
|
|
|
|
|
extra = HDstrtoll(argv[3], NULL, 0);
|
|
|
|
|
}
|
2005-02-08 09:03:48 +08:00
|
|
|
|
if (argc > 4) {
|
|
|
|
|
extra2 = HDstrtoll(argv[4], NULL, 0);
|
|
|
|
|
}
|
2001-02-23 05:49:40 +08:00
|
|
|
|
/*
|
|
|
|
|
* Read the signature at the specified file position.
|
|
|
|
|
*/
|
|
|
|
|
HDfprintf(stdout, "Reading signature at address %a (rel)\n", addr);
|
2003-03-22 22:53:27 +08:00
|
|
|
|
if (H5F_block_read(f, H5FD_MEM_SUPER, addr, sizeof(sig), dxpl, sig)<0) {
|
2001-02-23 05:49:40 +08:00
|
|
|
|
fprintf(stderr, "cannot read signature\n");
|
|
|
|
|
HDexit(3);
|
|
|
|
|
}
|
|
|
|
|
if (!HDmemcmp(sig, H5F_SIGNATURE, H5F_SIGNATURE_LEN)) {
|
|
|
|
|
/*
|
|
|
|
|
* Debug the boot block.
|
|
|
|
|
*/
|
2003-07-10 02:14:29 +08:00
|
|
|
|
status = H5F_debug(f, H5P_DATASET_XFER_DEFAULT, stdout, 0, VCOL);
|
2001-02-23 05:49:40 +08:00
|
|
|
|
|
|
|
|
|
} else if (!HDmemcmp(sig, H5HL_MAGIC, H5HL_SIZEOF_MAGIC)) {
|
|
|
|
|
/*
|
|
|
|
|
* Debug a local heap.
|
|
|
|
|
*/
|
2003-02-11 01:26:09 +08:00
|
|
|
|
status = H5HL_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL);
|
2001-02-23 05:49:40 +08:00
|
|
|
|
|
|
|
|
|
} else if (!HDmemcmp (sig, H5HG_MAGIC, H5HG_SIZEOF_MAGIC)) {
|
|
|
|
|
/*
|
|
|
|
|
* Debug a global heap collection.
|
|
|
|
|
*/
|
2003-02-11 01:26:09 +08:00
|
|
|
|
status = H5HG_debug (f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL);
|
2001-02-23 05:49:40 +08:00
|
|
|
|
|
|
|
|
|
} else if (!HDmemcmp(sig, H5G_NODE_MAGIC, H5G_NODE_SIZEOF_MAGIC)) {
|
|
|
|
|
/*
|
|
|
|
|
* Debug a symbol table node.
|
|
|
|
|
*/
|
2003-02-11 01:26:09 +08:00
|
|
|
|
status = H5G_node_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, extra);
|
2001-02-23 05:49:40 +08:00
|
|
|
|
|
|
|
|
|
} else if (!HDmemcmp(sig, H5B_MAGIC, H5B_SIZEOF_MAGIC)) {
|
|
|
|
|
/*
|
|
|
|
|
* Debug a B-tree. B-trees are debugged through the B-tree
|
|
|
|
|
* subclass. The subclass identifier is the byte immediately
|
|
|
|
|
* after the B-tree signature.
|
|
|
|
|
*/
|
|
|
|
|
H5B_subid_t subtype = (H5B_subid_t)sig[H5B_SIZEOF_MAGIC];
|
2005-02-08 09:03:48 +08:00
|
|
|
|
unsigned ndims;
|
2001-02-23 05:49:40 +08:00
|
|
|
|
|
|
|
|
|
switch (subtype) {
|
|
|
|
|
case H5B_SNODE_ID:
|
2003-02-11 01:26:09 +08:00
|
|
|
|
status = H5G_node_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, extra);
|
2001-02-23 05:49:40 +08:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case H5B_ISTORE_ID:
|
2004-12-29 22:26:20 +08:00
|
|
|
|
ndims = (unsigned)extra;
|
2004-06-06 03:06:24 +08:00
|
|
|
|
status = H5D_istore_debug (f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, ndims);
|
2001-02-23 05:49:40 +08:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
2003-02-11 01:26:09 +08:00
|
|
|
|
fprintf(stderr, "Unknown B-tree subtype %u\n", (unsigned)(subtype));
|
2001-02-23 05:49:40 +08:00
|
|
|
|
HDexit(4);
|
|
|
|
|
}
|
|
|
|
|
|
2005-02-04 03:59:05 +08:00
|
|
|
|
} else if (!HDmemcmp(sig, H5B2_HDR_MAGIC, H5B2_SIZEOF_MAGIC)) {
|
|
|
|
|
/*
|
|
|
|
|
* Debug a v2 B-tree. B-trees are debugged through the B-tree
|
|
|
|
|
* subclass. The subclass identifier is two bytes after the
|
|
|
|
|
* B-tree signature.
|
|
|
|
|
*/
|
|
|
|
|
H5B2_subid_t subtype = (H5B_subid_t)sig[H5B2_SIZEOF_MAGIC+1];
|
|
|
|
|
|
|
|
|
|
switch (subtype) {
|
2005-03-11 08:44:03 +08:00
|
|
|
|
case H5B2_TEST_ID:
|
|
|
|
|
status = H5B2_hdr_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5B2_TEST);
|
2005-02-04 03:59:05 +08:00
|
|
|
|
break;
|
|
|
|
|
|
2005-03-11 08:44:03 +08:00
|
|
|
|
case H5B2_BLK_TRK_ID:
|
|
|
|
|
status = H5B2_hdr_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5B2_BLKTRK);
|
2005-02-04 03:59:05 +08:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
fprintf(stderr, "Unknown B-tree subtype %u\n", (unsigned)(subtype));
|
|
|
|
|
HDexit(4);
|
2005-03-11 08:44:03 +08:00
|
|
|
|
} /* end switch */
|
2005-02-08 09:03:48 +08:00
|
|
|
|
|
|
|
|
|
} else if (!HDmemcmp(sig, H5B2_INT_MAGIC, H5B2_SIZEOF_MAGIC)) {
|
|
|
|
|
/*
|
|
|
|
|
* Debug a v2 B-tree. B-trees are debugged through the B-tree
|
|
|
|
|
* subclass. The subclass identifier is two bytes after the
|
|
|
|
|
* B-tree signature.
|
|
|
|
|
*/
|
|
|
|
|
H5B2_subid_t subtype = (H5B_subid_t)sig[H5B2_SIZEOF_MAGIC+1];
|
|
|
|
|
|
|
|
|
|
switch (subtype) {
|
2005-03-11 08:44:03 +08:00
|
|
|
|
case H5B2_TEST_ID:
|
|
|
|
|
status = H5B2_int_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5B2_TEST, extra, (unsigned)extra2);
|
2005-02-08 09:03:48 +08:00
|
|
|
|
break;
|
|
|
|
|
|
2005-03-11 08:44:03 +08:00
|
|
|
|
case H5B2_BLK_TRK_ID:
|
|
|
|
|
status = H5B2_int_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5B2_BLKTRK, extra, (unsigned)extra2);
|
2005-02-08 09:03:48 +08:00
|
|
|
|
break;
|
2005-02-04 03:59:05 +08:00
|
|
|
|
|
2005-02-08 09:03:48 +08:00
|
|
|
|
default:
|
|
|
|
|
fprintf(stderr, "Unknown B-tree subtype %u\n", (unsigned)(subtype));
|
|
|
|
|
HDexit(4);
|
2005-03-11 08:44:03 +08:00
|
|
|
|
} /* end switch */
|
2005-02-08 09:03:48 +08:00
|
|
|
|
|
|
|
|
|
} else if (!HDmemcmp(sig, H5B2_LEAF_MAGIC, H5B2_SIZEOF_MAGIC)) {
|
|
|
|
|
/*
|
|
|
|
|
* Debug a v2 B-tree. B-trees are debugged through the B-tree
|
|
|
|
|
* subclass. The subclass identifier is two bytes after the
|
|
|
|
|
* B-tree signature.
|
|
|
|
|
*/
|
|
|
|
|
H5B2_subid_t subtype = (H5B_subid_t)sig[H5B2_SIZEOF_MAGIC+1];
|
|
|
|
|
|
|
|
|
|
switch (subtype) {
|
2005-03-11 08:44:03 +08:00
|
|
|
|
case H5B2_TEST_ID:
|
|
|
|
|
status = H5B2_leaf_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5B2_TEST, extra, (unsigned)extra2);
|
2005-02-08 09:03:48 +08:00
|
|
|
|
break;
|
|
|
|
|
|
2005-03-11 08:44:03 +08:00
|
|
|
|
case H5B2_BLK_TRK_ID:
|
|
|
|
|
status = H5B2_leaf_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, H5B2_BLKTRK, extra, (unsigned)extra2);
|
2005-02-08 09:03:48 +08:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
fprintf(stderr, "Unknown B-tree subtype %u\n", (unsigned)(subtype));
|
|
|
|
|
HDexit(4);
|
2005-03-11 08:44:03 +08:00
|
|
|
|
} /* end switch */
|
|
|
|
|
|
|
|
|
|
} else if (!HDmemcmp(sig, H5BT_MAGIC, H5BT_SIZEOF_MAGIC)) {
|
|
|
|
|
/*
|
|
|
|
|
* Debug a block tracker info
|
|
|
|
|
*/
|
|
|
|
|
status = H5BT_hdr_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL);
|
2005-03-30 05:45:09 +08:00
|
|
|
|
|
|
|
|
|
} else if (!HDmemcmp(sig, H5SH_MAGIC, H5SH_SIZEOF_MAGIC)) {
|
|
|
|
|
/*
|
|
|
|
|
* Debug a segmented heap info
|
|
|
|
|
*/
|
|
|
|
|
status = H5SH_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL);
|
2005-02-04 03:59:05 +08:00
|
|
|
|
|
2001-02-23 05:49:40 +08:00
|
|
|
|
} else if (sig[0] == H5O_VERSION) {
|
|
|
|
|
/*
|
|
|
|
|
* This could be an object header. Since they don't have a signature
|
|
|
|
|
* it's a somewhat "ify" detection.
|
|
|
|
|
*/
|
2003-02-11 01:26:09 +08:00
|
|
|
|
status = H5O_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL);
|
2001-02-23 05:49:40 +08:00
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
/*
|
|
|
|
|
* Got some other unrecognized signature.
|
|
|
|
|
*/
|
|
|
|
|
printf("%-*s ", VCOL, "Signature:");
|
|
|
|
|
for (i = 0; i < 8; i++) {
|
|
|
|
|
if (sig[i] > ' ' && sig[i] <= '~' && '\\' != sig[i]) {
|
|
|
|
|
HDputchar(sig[i]);
|
|
|
|
|
} else if ('\\' == sig[i]) {
|
|
|
|
|
HDputchar('\\');
|
|
|
|
|
HDputchar('\\');
|
|
|
|
|
} else {
|
|
|
|
|
printf("\\%03o", sig[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
HDputchar('\n');
|
|
|
|
|
|
|
|
|
|
fprintf(stderr, "unknown signature\n");
|
|
|
|
|
HDexit(4);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (status < 0) {
|
|
|
|
|
fprintf(stderr, "An error occurred\n");
|
|
|
|
|
HDexit(5);
|
|
|
|
|
}
|
2003-03-22 22:53:27 +08:00
|
|
|
|
H5Pclose(dxpl);
|
|
|
|
|
H5Pclose(fapl);
|
2001-02-23 05:49:40 +08:00
|
|
|
|
H5Fclose(fid);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|