diff agent/src/os/solaris/dbx/svc_agent_dbx.hpp @ 0:a61af66fc99e jdk7-b24

Initial load
author duke
date Sat, 01 Dec 2007 00:00:00 +0000
parents
children c18cbe5936b8
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/agent/src/os/solaris/dbx/svc_agent_dbx.hpp	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,188 @@
+/*
+ * Copyright 2000-2001 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+#include "shell_imp.h"
+#include "IOBuf.hpp"
+#include <sys/time.h>
+#include <thread_db.h>
+
+typedef td_err_e td_init_fn_t();
+typedef td_err_e td_ta_new_fn_t(struct ps_prochandle *, td_thragent_t **);
+typedef td_err_e td_ta_delete_fn_t(td_thragent_t *);
+typedef td_err_e td_ta_map_id2thr_fn_t(const td_thragent_t *, thread_t,  td_thrhandle_t *);
+typedef td_err_e td_thr_getgregs_fn_t(const td_thrhandle_t *, prgregset_t);
+
+class ServiceabilityAgentDbxModule {
+public:
+  ServiceabilityAgentDbxModule(int major, int minor,
+                               shell_imp_interp_t interp, int argc, char *argv[]);
+  ~ServiceabilityAgentDbxModule();
+
+  bool install();
+  bool uninstall();
+
+  /* This is invoked through the dbx command interpreter. It listens
+     on a socket for commands and does not return until it receives an
+     "exit" command. At that point control is returned to dbx's main
+     loop, at which point if the user sends an exit command to dbx's
+     shell the dbx process will exit. Returns true if completed
+     successfully, false if an error occurred while running (for
+     example, unable to bind listening socket). */
+  bool run();
+
+private:
+
+  // This must be shared between the Java and C layers
+  static const int PORT = 21928;
+
+  // Command handlers
+  bool handleAddressSize(char* data);
+  bool handlePeekFailFast(char* data);
+  bool handlePeek(char* data);
+  bool handlePoke(char* data);
+  bool handleMapped(char* data);
+  bool handleLookup(char* data);
+  bool handleThrGRegs(char* data);
+
+  // Input routines
+
+  // May mutate addr argument even if result is false
+  bool scanAddress(char** data, psaddr_t* addr);
+  // May mutate num argument even if result is false
+  bool scanUnsignedInt(char** data, unsigned int* num);
+  // Returns NULL if error occurred while scanning. Otherwise, returns
+  // newly-allocated character array which must be freed with delete[].
+  char* scanSymbol(char** data);
+  // Helper routine: converts ASCII to 4-bit integer. Returns true if
+  // character is in range, false otherwise.
+  bool charToNibble(char ascii, int* value);
+
+  // Output routines
+
+  // Writes an int with no leading or trailing spaces
+  bool writeInt(int val, int fd);
+  // Writes an address in hex format with no leading or trailing
+  // spaces
+  bool writeAddress(psaddr_t addr, int fd);
+  // Writes a register in hex format with no leading or trailing
+  // spaces (addresses and registers might be of different size)
+  bool writeRegister(prgreg_t reg, int fd);
+  // Writes a space to given file descriptor
+  bool writeSpace(int fd);
+  // Writes carriage return to given file descriptor
+  bool writeCR(int fd);
+  // Writes a bool as [0|1]
+  bool writeBoolAsInt(bool val, int fd);
+  // Helper routine: converts low 4 bits to ASCII [0..9][A..F]
+  char nibbleToChar(unsigned char nibble);
+
+  // Base routine called by most of the above
+  bool writeString(const char* str, int fd);
+
+  // Writes a binary character
+  bool writeBinChar(char val, int fd);
+  // Writes a binary unsigned int in network (big-endian) byte order
+  bool writeBinUnsignedInt(unsigned int val, int fd);
+  // Writes a binary buffer
+  bool writeBinBuf(char* buf, int size, int fd);
+
+  // Routine to flush the socket
+  bool flush(int client_socket);
+
+  void cleanup(int client_socket);
+
+  // The shell interpreter on which we can invoke commands (?)
+  shell_imp_interp_t _interp;
+
+  // The "command line" arguments passed to us by dbx (?)
+  int _argc;
+  char **_argv;
+
+  // The installed command in the dbx shell
+  shell_imp_command_t _command;
+
+  // Access to libthread_db (dlsym'ed to be able to pick up the
+  // version loaded by dbx)
+  td_init_fn_t*          td_init_fn;
+  td_ta_new_fn_t*        td_ta_new_fn;
+  td_ta_delete_fn_t*     td_ta_delete_fn;
+  td_ta_map_id2thr_fn_t* td_ta_map_id2thr_fn;
+  td_thr_getgregs_fn_t*  td_thr_getgregs_fn;
+
+  // Our "thread agent" -- access to libthread_db
+  td_thragent_t* _tdb_agent;
+
+  // Path to libthread.so in target process; free with delete[]
+  char* libThreadName;
+
+  // Handle to dlopen'ed libthread_db.so
+  void* libThreadDB;
+
+  // Helper callback for finding libthread_db.so
+  friend int findLibThreadCB(const rd_loadobj_t* lo, void* data);
+
+  // Support for reading C strings out of the target process (so we
+  // can find the correct libthread_db). Returns newly-allocated char*
+  // which must be freed with delete[], or null if the read failed.
+  char* readCStringFromProcess(psaddr_t addr);
+
+  IOBuf myComm;
+
+  // Output buffer support (used by writeString, writeChar, flush)
+  char* output_buffer;
+  int output_buffer_size;
+  int output_buffer_pos;
+
+  // "Fail fast" flag
+  bool peek_fail_fast;
+
+  // Commands
+  static const char* CMD_ADDRESS_SIZE;
+  static const char* CMD_PEEK_FAIL_FAST;
+  static const char* CMD_PEEK;
+  static const char* CMD_POKE;
+  static const char* CMD_MAPPED;
+  static const char* CMD_LOOKUP;
+  static const char* CMD_THR_GREGS;
+  static const char* CMD_EXIT;
+};
+
+// For profiling. Times reported are in milliseconds.
+class Timer {
+public:
+  Timer();
+  ~Timer();
+
+  void start();
+  void stop();
+  long total();
+  long average();
+  void reset();
+
+private:
+  struct timeval startTime;
+  long long totalMicroseconds; // stored internally in microseconds
+  int counter;
+  long long timevalDiff(struct timeval* startTime, struct timeval* endTime);
+};