13 """A subclass of the standard optparse OptionParser for gdb
15 GdbOptionParser raises GdbError rather than exiting when asked for help, or
16 when given an illegal value. E.g.
18 parser = gdb.printing.GdbOptionParser("show image")
19 parser.add_option("-a", "--all", action="store_true",
20 help="Display the whole image")
21 parser.add_option("-w", "--width", type="int", default=8,
22 help="Field width for pixels")
24 opts, args = parser.parse_args(args)
29 Like optparse.OptionParser's API, but with an initial command name argument
32 if not kwargs.get(
"prog"):
34 optparse.OptionParser.__init__(self, *args, **kwargs)
37 """Call OptionParser.parse_args after running gdb.string_to_argv"""
41 args = gdb.string_to_argv(args)
45 help = (
"-h" in args
or "--help" in args)
46 opts, args = optparse.OptionParser.parse_args(self, args, values)
53 def exit(self, status=0, msg=""):
54 """Raise GdbError rather than exiting"""
57 print >> sys.stderr, msg
59 raise gdb.GdbError(msg)
72 return "shared_ptr(%s)" % self.
val[
"px"].dereference()
77 "Print a boost::gil pixel"
83 import pdb; pdb.set_trace()
84 return self.
val[
"_v0"]
89 m_storage = val[
"m_storage"]
91 nx, ny = m_storage[
"m_cols"], m_storage[
"m_rows"]
94 nx, ny = val.type.template_argument(1), val.type.template_argument(2)
97 size = m_storage[
"m_data"][
"array"].type.sizeof
98 size0 = m_storage[
"m_data"][
"array"].dereference().type.sizeof
100 nx = int(math.sqrt(size/size0))
106 if re.search(
r"Matrix", str(var.type)):
108 return var[
"operator()(int, int)"](x, y)
112 if x < 0
or x >= NX
or y < 0
or y >= NY:
113 raise gdb.GdbError(
"Element (%d, %d) is out of range 0:%d, 0:%d" %
114 (x, y, NX - 1, NY - 1))
116 m_data = var[
"m_storage"][
"m_data"]
119 import pdb; pdb.set_trace()
120 m_data = m_data.address.cast(m_data.type)
123 val = m_data[x + y*NX]
125 val = m_data[
"array"][x + y*NX]
128 return var[
"operator()(int)"](x)
133 raise gdb.GdbError(
"Element (%d) is out of range 0:%d" % (x, NX - 1))
135 m_data = var[
"m_storage"][
"m_data"]
139 m_data = m_data.address.cast(m_data.type)
144 val = m_data[
"array"][x]
146 if val.type.code == gdb.TYPE_CODE_INT:
148 elif val.type.code == gdb.TYPE_CODE_FLT:
154 "Print an Eigen Matrix"
162 return "%s{%dx%d}" % (self.val.type, nx, ny)
165 "Print an Eigen Vector"
171 m_storage = self.
val[
"m_storage"]
177 n = m_storage.type.template_argument(1)
180 size = m_storage[
"m_data"][
"array"].type.sizeof
181 size0 = m_storage[
"m_data"][
"array"].dereference().type.sizeof
182 n = math.sqrt(size/size0)
187 """Print an eigen Matrix or Vector
188 Usage: show eigen <matrix> [x0 y0 [nx ny]]
189 show eigen <vector> [x0 [nx]]
193 super (PrintEigenCommand, self).__init__ (
"show eigen",
208 parser.add_option(
"-d",
"--dataFmt", default=
"%.2f", help=
"Format for values")
209 parser.add_option(
"-f",
"--formatWidth", type=
"int", default=8, help=
"Field width for values")
210 parser.add_option(
"-o",
"--origin", type=
"str", nargs=
"+",
211 help=
"Origin of the part of the object to print")
213 parser.add_option(
"eigenObject", help=
"Expression giving Eigen::Matrix/Vector to show")
214 parser.add_option(
"nx", help=
"Width of patch to print", type=
"int", default=0, nargs=
"?")
215 parser.add_option(
"ny", help=
"Height of patch to print", type=
"int", default=0, nargs=
"?")
217 opts = parser.parse_args(args)
221 (opts, args) = parser.parse_args(args)
226 raise gdb.GdbError(
"Please specify an object")
227 opts.eigenObject = args.pop(0)
229 opts.nx, opts.ny = 0, 0
231 opts.nx = int(args.pop(0))
233 opts.ny = int(args.pop(0))
236 raise gdb.GdbError(
"Unrecognised trailing arguments: %s" %
" ".join(args))
238 var = gdb.parse_and_eval(opts.eigenObject)
240 if not re.search(
r"(Eigen|LinearTransform)::(Matrix|Vector)", str(var.type)):
241 raise gdb.GdbError(
"Please specify an eigen matrix or vector, not %s" % var.type)
243 if re.search(
r"shared_ptr<", str(var.type)):
244 var = var[
"px"].dereference()
246 if var.type.code == gdb.TYPE_CODE_PTR:
247 var = var.dereference()
249 isMatrix = re.search(
r"Matrix", str(var.type))
254 if len(opts.origin) != 2:
255 raise gdb.GdbError(
"Please specify both x0 and y0")
257 x0 = gdb.parse_and_eval(opts.origin[0])
258 y0 = gdb.parse_and_eval(opts.origin[1])
269 if nx == 1
and ny == 1:
270 print "%g" % self.
_vget(var, x0)
273 NX = 0, var[
"m_storage"][
"n"]
276 if len(opts.origin) != 1:
277 raise gdb.GdbError(
"Please only specify x0")
279 x0 = gdb.parse_and_eval(opts.origin[0])
288 print "%g" % self.
_vget(var, x0)
295 for x
in range(x0, min(NX, x0 + nx)):
296 print "%*d" % (opts.formatWidth, x),
299 for y
in range(y0, min(NY, y0 + ny)):
301 for x
in range(x0, min(NX, x0 + nx)):
302 print "%*s" % (opts.formatWidth, (opts.dataFmt % self.
_mget(var, x, y))),
305 for x
in range(x0, min(NX, x0 + nx)):
306 print "%*s" % (opts.formatWidth, (opts.dataFmt % self.
_vget(var, x))),
320 sentinel = long(self.
val[
"_sentinel"].cast(gdb.lookup_type(
"unsigned int")))
321 return "{%s %d 0x%x}" % (self.val.address, self.
val[
"_CitizenId"], sentinel)
325 Usage: show citizen <obj>
329 super (PrintCitizenCommand, self).__init__ (
"show citizen",
338 parser.add_option(
"object", help=
"The object in question")
340 opts = parser.parse_args(args)
344 opts, args = parser.parse_args(args)
349 raise gdb.GdbError(
"Please specify an object")
350 opts.object = args.pop(0)
353 raise gdb.GdbError(
"Unrecognised trailing arguments: %s" %
" ".join(args))
355 var = gdb.parse_and_eval(opts.object)
356 if re.search(
r"shared_ptr<", str(var.type)):
359 if var.type.code != gdb.TYPE_CODE_PTR:
362 citizen = var.dynamic_cast(gdb.lookup_type(
"lsst::daf::base::Citizen").pointer())
365 raise gdb.GdbError(
"Failed to cast %s to Citizen -- is it a subclass?" % opts.object)
367 citizen = citizen.dereference()
377 "Print a BaseSourceAttributes"
383 return "Base: {id=%d astrom=(%.3f, %.3f)}" % (self.
val[
"_id"], self.
val[
"_xAstrom"], self.
val[
"_yAstrom"])
392 return "Source{id=%d astrom=(%.3f, %.3f)}" % (self.
val[
"_id"],
393 self.
val[
"_xAstrom"], self.
val[
"_yAstrom"])
396 "Print a cameraGeom::Detector"
402 return "Detector{name: %s id: %s type: %s bbox: %s}" % (self.
val[
"_name"], self.
val[
"_id"],
403 self.
val[
"_type"], self.
val[
"_bbox"])
413 nspan = self.
val[
"_spans"][
"size"]()
415 vec_impl = self.
val[
"_spans"][
"_M_impl"]
416 nspan = vec_impl[
"_M_finish"] - vec_impl[
"_M_start"]
418 return "Footprint{id=%d, nspan=%d, area=%d; BBox %s}" % (self.
val[
"_fid"], nspan,
419 self.
val[
"_area"], self.
val[
"_bbox"])
422 "Print a FootprintSet"
428 return "FootprintSet{%s; %s}" % (self.
val[
"_region"], self.
val[
"_footprints"])
437 return "Peak{%d, (%.2f, %.2f)}" % (self.
val[
"_id"], self.
val[
"_fx"], self.
val[
"_fy"])
443 return "%s" % (self.typeName())
456 if type.code == gdb.TYPE_CODE_REF:
457 type = type.target ()
460 dims = [
getEigenValue(self.
val[
"_dimensions"][
"_vector"], i)
for i
in range(2)]
462 return "Box2{(%s,%s)--(%s,%s)}" % (llc[0], llc[1],
463 llc[0] + dims[0] - 1, llc[1] + dims[1] - 1)
469 "Print a CoordinateBase"
475 return self.
val[
"_vector"][
"m_storage"][
"m_data"][
"array"]
483 "Print an ellipse::Axes"
489 vec = self.
val[
"_vector"]
493 "Print an ellipse::Quadrupole"
499 mat = self.
val[
"_matrix"]
510 "Print an ImageBase or derived class"
518 if type.code == gdb.TYPE_CODE_REF:
521 gilView = val[
"_gilView"]
522 arr = val[
"_origin"][
"_vector"][
"m_storage"][
"m_data"][
"array"]
524 x0, y0 = arr[0], arr[1]
525 return "%dx%d%s%d%s%d" % (
527 gilView[
"_dimensions"][
"x"], gilView[
"_dimensions"][
"y"],
528 [
"",
"+"][x0 >= 0], x0,
529 [
"",
"+"][y0 >= 0], y0)
532 return self.typename.split(
":")[-1]
542 "Print a MaskedImage"
552 self.
dimenStr(self.
val[
"_maskedImage"][
"_image"][
"px"].dereference()))
560 super (PrintImageCommand, self).__init__ (
"show image",
566 return var[
"operator()(int, int, bool)"](x, y,
True)
568 dimensions = var[
"_gilView"][
"_dimensions"]
569 if x < 0
or x >= dimensions[
"x"]
or y < 0
or y >= dimensions[
"y"]:
570 raise gdb.GdbError(
"Pixel (%d, %d) is out of range 0:%d, 0:%d" %
571 (x, y, dimensions[
"x"] - 1, dimensions[
"y"] - 1))
573 pixels = var[
"_gilView"][
"_pixels"][
"_p"]
574 step = pixels[
"_step_fn"][
"_step"]/var.type.template_argument(0).sizeof
576 return pixels[
"m_iterator"][x + y*step][
"_v0"]
581 parser =
GdbOptionParser(
"show image" + (
"" if argparse
else " <image> [<nx> [<ny>]]"))
582 parser.add_option(
"-a",
"--all", action=
"store_true", help=
"Display the whole image/mask")
583 parser.add_option(
"-c",
"--center", type=
"str", nargs=2, default=(
None,
None,),
584 help=
"Center the output at (x, y)")
585 parser.add_option(
"-o",
"--origin", type=
"str", nargs=2, default=(
None,
None,),
586 help=
"Print the region starting at (x, y)")
587 parser.add_option(
"-x",
"--xy0", action=
"store_true", help=
"Obey the image's (x0, y0)")
588 parser.add_option(
"-f",
"--formatWidth", type=
"int", default=8, help=
"Field width for values")
589 parser.add_option(
"-d",
"--dataFmt", default=
"%.2f", help=
"Format for values")
592 parser.add_option(
"image", help=
"Expression giving image to show")
593 parser.add_option(
"width", help=
"Width of patch to print", default=1, nargs=
"?")
594 parser.add_option(
"height", help=
"Height of patch to print", default=1, nargs=
"?")
596 opts = parser.parse_args(args)
600 opts, args = parser.parse_args(args)
605 raise gdb.GdbError(
"Please specify an image")
607 opts.image = args.pop(0)
609 opts.width, opts.height = 1, 1
611 opts.width = int(args.pop(0))
613 opts.height = int(args.pop(0))
616 raise gdb.GdbError(
"Unrecognised trailing arguments: %s" %
" ".join(args))
620 if opts.origin[i]
is None:
621 if opts.center[i]
is not None:
625 if opts.center[i]
is not None:
626 raise gdb.GdbError(
"You may not specify both --center and --origin")
628 val = gdb.parse_and_eval(val)
635 nx, ny = opts.width, opts.height
637 var = gdb.parse_and_eval(opts.image)
639 if re.search(
r"shared_ptr<", str(var.type)):
640 var = var[
"px"].dereference()
642 if not re.search(
r"(lsst::afw::image::)?(Image|Mask|MaskedImage)", str(var.type.unqualified())):
643 raise gdb.GdbError(
"Please specify an image, not %s" % var.type)
645 if re.search(
r"MaskedImage", str(var.type))
and \
646 not re.search(
r"::Image(\s*&)?$", str(var.type)):
647 print "N.b. %s is a MaskedImage; showing image" % (opts.image)
650 if re.search(
r"shared_ptr<", str(var.type)):
651 var = var[
"px"].dereference()
653 if var.type.code == gdb.TYPE_CODE_PTR:
654 var = var.dereference()
656 pixelTypeName = str(var.type.template_argument(0))
658 dataFmt = opts.dataFmt
659 elif pixelTypeName
in [
"short",
"unsigned short"]:
661 elif pixelTypeName
in [
"int",
"unsigned int"]:
667 nx = var[
"_gilView"][
"_dimensions"][
"x"]
669 ny = var[
"_gilView"][
"_dimensions"][
"y"]
675 if opts.xy0
and not opts.all:
676 arr = var[
"_origin"][
"_vector"][
"m_storage"][
"m_data"][
"array"]
684 for x
in range(x0, x0 + nx):
685 print "%*d" % (opts.formatWidth, x),
688 for y
in reversed(range(y0, y0 + ny)):
690 for x
in range(x0, x0 + nx):
691 print "%*s" % (opts.formatWidth, dataFmt % self.
get(var, x, y)),
706 return "Background(%dx%d) %s %s" % (
707 self.
val[
"_imgWidth"], self.
val[
"_imgHeight"],
711 "Print a BackgroundControl"
718 return "{%s %s %s %s}" % (re.sub(
r"lsst::afw::math::Interpolate::",
"", str(self.
val[
"_style"])),
719 re.sub(
r"lsst::afw::math::",
"", str(self.
val[
"_prop"])),
720 re.sub(
r"lsst::afw::math::",
"", str(self.
val[
"_undersampleStyle"])),
721 self.
val[
"_sctrl"][
"px"].dereference())
731 return "%s(%dx%d)" % (self.
typename,
732 self.
val[
"_width"], self.
val[
"_height"])
737 "Print a StatisticsControl"
744 return "{nSigma=%g nIter=%d ignore=0x%x}" % (self.
val[
"_numSigmaClip"],
745 self.
val[
"_numIter"],
746 self.
val[
"_andMask"])
751 "Print a table::Table"
758 return "{schema = %s, md=%s}" % (self.
val[
"_schema"], self.
val[
"_metadata"])
761 "Print a table::Schema"
768 names = str(self.
val[
"_impl"][
"px"][
"_names"])
769 names = re.sub(
r"^[^{]*{|}|[\[\]\"\"]|\s*=\s*[^,]*",
"", names)
771 return "%s" % (names)
778 "Register my pretty-printers with objfile Obj."
784 gdb.printing.register_pretty_printer(obj, p, replace=
True)
789 """Surely this must be somewhere standard?"""
791 printer = gdb.printing.RegexpCollectionPrettyPrinter(
"rhl-boost")
793 printer.add_printer(
'boost::shared_ptr',
794 '^(boost|tr1|std)::shared_ptr', SharedPtrPrinter)
795 printer.add_printer(
'boost::gil::pixel',
796 'boost::gil::.*pixel_t', GilPixelPrinter)
803 """Surely this must be somewhere standard?"""
805 printer = gdb.printing.RegexpCollectionPrettyPrinter(
"rhl-eigen")
807 printer.add_printer(
'eigen::Matrix',
808 '^Eigen::Matrix', EigenMatrixPrinter)
809 printer.add_printer(
'eigen::Vector',
810 '^Eigen::Vector', EigenVectorPrinter)
819 printer = gdb.printing.RegexpCollectionPrettyPrinter(
"afw")
821 printer.add_printer(
'lsst::afw::cameraGeom::Detector',
822 '^lsst::afw::cameraGeom::(Amp|Ccd|Detector|DetectorMosaic)$', DetectorPrinter)
824 printer.add_printer(
'lsst::afw::detection::Footprint',
825 '^lsst::afw::detection::Footprint$', FootprintPrinter)
826 printer.add_printer(
'lsst::afw::detection::FootprintSet',
827 '^lsst::afw::detection::FootprintSet', FootprintSetPrinter)
828 printer.add_printer(
'lsst::afw::detection::Peak',
829 '^lsst::afw::detection::Peak$', PeakPrinter)
830 printer.add_printer(
'lsst::afw::detection::Psf',
831 '^lsst::afw::detection::Psf$', PsfPrinter)
832 printer.add_printer(
'lsst::afw::detection::Source',
833 '^lsst::afw::detection::Source$', SourcePrinter)
834 printer.add_printer(
'lsst::afw::detection::BaseSourceAttributes',
835 '^lsst::afw::detection::BaseSourceAttributes$', BaseSourceAttributesPrinter)
837 printer.add_printer(
'lsst::afw::geom::Box',
838 '^lsst::afw::geom::Box', Box2Printer)
839 printer.add_printer(
'lsst::afw::geom::Extent',
840 '^lsst::afw::geom::Extent', CoordinateBasePrinter)
841 printer.add_printer(
'lsst::afw::geom::Point',
842 '^lsst::afw::geom::Point', CoordinateBasePrinter)
844 printer.add_printer(
'lsst::afw::geom::ellipses::Axes',
845 '^lsst::afw::geom::ellipses::Axes', AxesPrinter)
846 printer.add_printer(
'lsst::afw::geom::ellipses::Quadrupole',
847 '^lsst::afw::geom::ellipses::Quadrupole', QuadrupolePrinter)
849 printer.add_printer(
'lsst::afw::image::ImageBase',
850 'lsst::afw::image::ImageBase<[^>]+>$', ImagePrinter)
851 printer.add_printer(
'lsst::afw::image::Image',
852 'lsst::afw::image::Image<[^>]+>$', ImagePrinter)
853 printer.add_printer(
'lsst::afw::image::Mask',
854 '^lsst::afw::image::Mask<[^>]+>$', ImagePrinter)
855 printer.add_printer(
'lsst::afw::image::MaskedImage',
856 '^lsst::afw::image::MaskedImage<[^>]+>$', MaskedImagePrinter)
857 printer.add_printer(
'lsst::afw::image::Exposure',
858 '^lsst::afw::image::Exposure', ExposurePrinter)
860 printer.add_printer(
'lsst::afw::math::Background',
861 '^lsst::afw::math::Background$', BackgroundPrinter)
862 printer.add_printer(
'lsst::afw::math::BackgroundControl',
863 '^lsst::afw::math::BackgroundControl$', BackgroundControlPrinter)
864 printer.add_printer(
'lsst::afw::math::Kernel',
865 '^lsst::afw::math::.*Kernel', KernelPrinter)
866 printer.add_printer(
'lsst::afw::math::StatisticsControl',
867 '^lsst::afw::math::StatisticsControl', StatisticsControlPrinter)
869 printer.add_printer(
'lsst::afw::table::Table',
870 '^lsst::afw::table::.*Table$', TablePrinter)
871 printer.add_printer(
'lsst::afw::table::Schema',
872 '^lsst::afw::table::Schema$', TableSchemaPrinter)
879 printer = gdb.printing.RegexpCollectionPrettyPrinter(
"daf::base")
881 printer.add_printer(
'lsst::daf::base::Citizen',
882 'lsst::daf::base::Citizen', CitizenPrinter)
887 except ImportError, e:
889 from printers_oldgdb
import *
def getEigenMatrixDimensions
def build_daf_base_dictionary
def build_boost_dictionary
def build_eigen_dictionary