On Tue, Jul 07, 2026 at 09:48:19AM +0200, Denis V. Lunev via Devel wrote:
> QEMU reports win-dmp as available only when the guest is Windows
> and has published a vmcoreinfo dump header. In that case prefer it
> over the elf default: converting an elf dump into a Windows-
> debuggable format afterwards is possible but complicated and
> unreliable.

Hmm, this is only correct when referring to latest pending QEMU
11.1 release. Previous releases unconditionally report win-dmp,
so unless we filter on fixed QEMU we'll break auto-dump for all
non-Windows guests in existing QEMU releases.

> 
> Add qemuDomainGetAutoDumpFormat(), which probes win-dmp support
> right before an auto-triggered dump and falls back to elf
> otherwise. Use it from both doCoreDumpToAutoDumpPath() (on_crash)
> and processWatchdogEvent() (watchdog dump). virDomainCoreDump() and
> virDomainCoreDumpWithFormat() are left untouched, since RAW there
> is a documented part of their API contract, standing in for an
> explicit caller request rather than an internal default.
> 
> The probe is best-effort: reset any error left by a failed monitor
> call or QMP command, so it cannot leak past a dump that otherwise
> succeeds.
> 
> Signed-off-by: Denis V. Lunev <[email protected]>
> ---
>  src/qemu/qemu_driver.c | 30 ++++++++++++++++++++++++++++--
>  1 file changed, 28 insertions(+), 2 deletions(-)
> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 8ec9e1f9c4..b59a714a81 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -3532,6 +3532,31 @@ getAutoDumpPath(virQEMUDriver *driver,
>      return g_strdup_printf("%s/%s-%s", cfg->autoDumpPath, domname, nowstr);
>  }
>  
> +/* win-dmp is reported only for a Windows guest that has published a
> + * vmcoreinfo dump header, so prefer it whenever QEMU confirms it. */
> +static unsigned int
> +qemuDomainGetAutoDumpFormat(virDomainObj *vm)
> +{
> +    qemuDomainObjPrivate *priv = vm->privateData;
> +    unsigned int dumpformat = VIR_DOMAIN_CORE_DUMP_FORMAT_RAW;
> +    int rc;
> +
> +    if (qemuDomainObjEnterMonitorAsync(vm, VIR_ASYNC_JOB_DUMP) < 0) {
> +        virResetLastError();
> +        return dumpformat;
> +    }
> +
> +    rc = qemuMonitorGetDumpGuestMemoryCapability(priv->mon, "win-dmp");
> +    if (rc < 0)
> +        virResetLastError();
> +    else if (rc > 0)
> +        dumpformat = VIR_DOMAIN_CORE_DUMP_FORMAT_WIN_DMP;
> +
> +    qemuDomainObjExitMonitor(vm);
> +    return dumpformat;
> +}
> +
> +
>  static void
>  processWatchdogEvent(virQEMUDriver *driver,
>                       virDomainObj *vm,
> @@ -3558,7 +3583,7 @@ processWatchdogEvent(virQEMUDriver *driver,
>  
>          flags |= cfg->autoDumpBypassCache ? VIR_DUMP_BYPASS_CACHE: 0;
>          if ((ret = doCoreDump(driver, vm, dumpfile, flags,
> -                              VIR_DOMAIN_CORE_DUMP_FORMAT_RAW)) < 0)
> +                              qemuDomainGetAutoDumpFormat(vm))) < 0)
>              virReportError(VIR_ERR_OPERATION_FAILED,
>                             "%s", _("Dump failed"));
>  
> @@ -3578,6 +3603,7 @@ processWatchdogEvent(virQEMUDriver *driver,
>      virDomainObjEndAsyncJob(vm);
>  }
>  
> +
>  static int
>  doCoreDumpToAutoDumpPath(virQEMUDriver *driver,
>                           virDomainObj *vm,
> @@ -3592,7 +3618,7 @@ doCoreDumpToAutoDumpPath(virQEMUDriver *driver,
>  
>      flags |= cfg->autoDumpBypassCache ? VIR_DUMP_BYPASS_CACHE: 0;
>      if ((ret = doCoreDump(driver, vm, dumpfile, flags,
> -                          VIR_DOMAIN_CORE_DUMP_FORMAT_RAW)) < 0)
> +                          qemuDomainGetAutoDumpFormat(vm))) < 0)
>          virReportError(VIR_ERR_OPERATION_FAILED,
>                         "%s", _("Dump failed"));
>      return ret;
> -- 
> 2.53.0
> 

With regards,
Daniel
-- 
|: https://berrange.com       ~~        https://hachyderm.io/@berrange :|
|: https://libvirt.org          ~~          https://entangle-photo.org :|
|: https://pixelfed.art/berrange   ~~    https://fstop138.berrange.com :|

Reply via email to