Implement xl dump-core
authorStefano Stabellini <sstabellini@xensource.com>
Mon, 19 Jul 2010 14:33:38 +0000 (15:33 +0100)
committerStefano Stabellini <sstabellini@xensource.com>
Mon, 19 Jul 2010 14:33:38 +0000 (15:33 +0100)
Implements dump-core command which is similar to xm dump-core except
that it requires an additional argument which is the target filename.

Signed-off-by: Gianni Tedesco <gianni.tedesco@citrix.com>
tools/libxl/libxl.c
tools/libxl/libxl.h
tools/libxl/xl.h
tools/libxl/xl_cmdimpl.c
tools/libxl/xl_cmdtable.c

index 0624990fbb9a5206ac317eb5a94ca30d8461b212..80969d60c63092444e7f35274a96d78808adddb9 100644 (file)
@@ -523,6 +523,13 @@ int libxl_domain_pause(struct libxl_ctx *ctx, uint32_t domid)
     return 0;
 }
 
+int libxl_domain_core_dump(struct libxl_ctx *ctx, uint32_t domid, const char *filename)
+{
+    if ( xc_domain_dumpcore(ctx->xch, domid, filename) )
+        return ERROR_FAIL;
+    return 0;
+}
+
 int libxl_domain_unpause(struct libxl_ctx *ctx, uint32_t domid)
 {
     char *path;
index c5d38e60516c344c391832fb17d93f742b8868de..1c7484747f5e7867fa2c96d482d6018729f77201 100644 (file)
@@ -395,6 +395,8 @@ int libxl_domain_rename(struct libxl_ctx *ctx, uint32_t domid,
 int libxl_domain_pause(struct libxl_ctx *ctx, uint32_t domid);
 int libxl_domain_unpause(struct libxl_ctx *ctx, uint32_t domid);
 
+int libxl_domain_core_dump(struct libxl_ctx *ctx, uint32_t domid, const char *filename);
+
 int libxl_domain_setmaxmem(struct libxl_ctx *ctx, uint32_t domid, uint32_t target_memkb);
 int libxl_set_memory_target(struct libxl_ctx *ctx, uint32_t domid, uint32_t target_memkb, int enforce);
 
index 18db408714dae10d7a9fc9e96d4ec1ace35eab96..79a42046213c4927fe955ffc061cb01f2945aa2e 100644 (file)
@@ -37,6 +37,7 @@ int main_restore(int argc, char **argv);
 int main_migrate_receive(int argc, char **argv);
 int main_save(int argc, char **argv);
 int main_migrate(int argc, char **argv);
+int main_dump_core(int argc, char **argv);
 int main_pause(int argc, char **argv);
 int main_unpause(int argc, char **argv);
 int main_destroy(int argc, char **argv);
index 152be2b639400700686443197be873e5617ca66d..3379252a37d7d8ded89c0a32c86cb81c973ffafa 100644 (file)
@@ -2264,6 +2264,14 @@ static void migrate_domain(char *domain_spec, const char *rune,
     exit(-ERROR_BADFAIL);
 }
 
+static void core_dump_domain(const char *domain_spec, const char *filename)
+{
+    int rc;
+    find_domain(domain_spec);
+    rc=libxl_domain_core_dump(&ctx, domid, filename);
+    if (rc) { fprintf(stderr,"core dump failed (rc=%d)\n.",rc);exit(-1); }
+}
+
 static void migrate_receive(int debug, int daemonize)
 {
     int rc, rc2;
@@ -2533,6 +2541,16 @@ int main_migrate(int argc, char **argv)
     exit(0);
 }
 
+int main_dump_core(int argc, char **argv)
+{
+    if ( argc-optind < 2 ) {
+        help("dump-core");
+        exit(2);
+    }
+    core_dump_domain(argv[optind], argv[optind + 1]);
+    exit(0);
+}
+
 int main_pause(int argc, char **argv)
 {
     int opt;
index d7330fec05961daedecb1bb6b50800210c058780..1621cbb4351da0a69a3f58acb62a3ad3c74a82b6 100644 (file)
@@ -102,6 +102,11 @@ struct cmd_spec cmd_table[] = {
       "-e              Do not wait in the background (on <host>) for the death\n"
       "                of the domain."
     },
+    { "dump-core",
+      &main_dump_core,
+      "Core dump a domain",
+      "<Domain> <filename>"
+    },
     { "restore",
       &main_restore,
       "Restore a domain from a saved state",