diff -r ec03b24a2d83 tools/libxc/xc_core.c --- a/tools/libxc/xc_core.c Tue Aug 15 19:53:55 2006 +0100 +++ b/tools/libxc/xc_core.c Thu Aug 17 17:11:21 2006 +0900 @@ -37,6 +37,7 @@ xc_domain_dumpcore_via_callback(int xc_h char dummy[PAGE_SIZE]; int dummy_len; int sts; + unsigned int cpy_err_cnt = 0; if ( (dump_mem_start = malloc(DUMP_INCREMENT*PAGE_SIZE)) == NULL ) { @@ -103,7 +104,13 @@ xc_domain_dumpcore_via_callback(int xc_h for ( dump_mem = dump_mem_start, i = 0; i < nr_pages; i++ ) { - copy_from_domain_page(xc_handle, domid, page_array[i], dump_mem); + sts = copy_from_domain_page(xc_handle, domid, page_array[i], dump_mem); + + if( sts != 0 ){ + cpy_err_cnt++; + memset(dump_mem, 0, PAGE_SIZE); + } + dump_mem += PAGE_SIZE; if ( ((i + 1) % DUMP_INCREMENT == 0) || ((i + 1) == nr_pages) ) { @@ -112,6 +119,10 @@ xc_domain_dumpcore_via_callback(int xc_h goto error_out; dump_mem = dump_mem_start; } + } + if( cpy_err_cnt != 0 ){ + IPRINTF("Could not copy from domid=%d (%d)pages\n", domid, cpy_err_cnt); + goto error_out; } free(dump_mem_start); diff -r ec03b24a2d83 tools/python/xen/xend/XendDomain.py --- a/tools/python/xen/xend/XendDomain.py Tue Aug 15 19:53:55 2006 +0100 +++ b/tools/python/xen/xend/XendDomain.py Wed Aug 16 14:56:32 2006 +0900 @@ -390,6 +390,22 @@ class XendDomain: except Exception, ex: raise XendError(str(ex)) + def domain_dump(self, domid, filename): + """Dump domain core.""" + + dominfo = self.domain_lookup_by_name_or_id_nr(domid) + if not dominfo: + raise XendInvalidDomain(str(domid)) + + if dominfo.getDomid() == PRIV_DOMAIN: + raise XendError("Cannot dump core for privileged domain %s" % domid) + + try: + log.info("Dumping Core for Domain %s (%d).", dominfo.getName(), + dominfo.getDomid()) + return dominfo.dumpCore(filename) + except Exception, ex: + raise XendError(str(ex)) def domain_destroy(self, domid): """Terminate domain immediately.""" diff -r ec03b24a2d83 tools/python/xen/xend/XendDomainInfo.py --- a/tools/python/xen/xend/XendDomainInfo.py Tue Aug 15 19:53:55 2006 +0100 +++ b/tools/python/xen/xend/XendDomainInfo.py Wed Aug 16 14:54:55 2006 +0900 @@ -967,11 +967,12 @@ class XendDomainInfo: self.restart(True) - def dumpCore(self): + def dumpCore(self,corefile=None): """Create a core dump for this domain. Nothrow guarantee.""" try: - corefile = "/var/xen/dump/%s.%s.core" % (self.info['name'], + if not corefile: + corefile = "/var/xen/dump/%s.%s.core" % (self.info['name'], self.domid) xc.domain_dumpcore(self.domid, corefile) diff -r ec03b24a2d83 tools/python/xen/xm/main.py --- a/tools/python/xen/xm/main.py Tue Aug 15 19:53:55 2006 +0100 +++ b/tools/python/xen/xm/main.py Wed Aug 16 14:53:12 2006 +0900 @@ -57,6 +57,8 @@ create_help = """create [-c] [Name=Value].. Create a domain based on Config File""" destroy_help = "destroy Terminate a domain immediately" +dump_core_help="dump-core [-LC][FileName] Dump core of the specified domain" + help_help = "help Display this message" list_help = "list [--long] [DomId, ...] List information about domains" list_label_help = "list [--label] [DomId, ...] List information about domains including their labels" @@ -140,6 +142,7 @@ short_command_list = [ "console", "create", "destroy", + "dump-core", "help", "list", "mem-set", @@ -161,6 +164,7 @@ domain_commands = [ "destroy", "domid", "domname", + "dump-core", "list", "list_label", "mem-max", @@ -593,6 +597,45 @@ def xm_unpause(args): server.xend.domain.unpause(dom) +def xm_dump_core(args): + arg_check(args, "dump-core",1,3) + live=False + crash=False + import getopt + optlist,args=getopt.gnu_getopt(args,"LC") + for opt in optlist: + if opt[0]=="-L": + live=True + if opt[0]=="-C": + crash=True + + if len(args)==0 or len(args)>2: + err("invalid number of parameters") + usage("dump-core") + + dom=args[0] + if len(args)==2: + filename=args[1] + else: + filename=None + + if not live: + server.xend.domain.pause(dom) + + try: + print "dumping core of domain:%s ..." % str(dom) + server.xend.domain.dump(dom,filename) + except KeyboardInterrupt: + server.xend.domain.unpause(dom) + + if not live: + server.xend.domain.unpause(dom) + + if crash: + print "destroying domain:%s ..." % str(dom) + server.xend.domain.destroy(dom) + + def xm_rename(args): arg_check(args, "rename", 2) @@ -1170,6 +1213,7 @@ commands = { "destroy": xm_destroy, "domid": xm_domid, "domname": xm_domname, + "dump-core": xm_dump_core, "rename": xm_rename, "restore": xm_restore, "save": xm_save,