Message ID | 1349093887-32142-1-git-send-email-pbonzini@redhat.com |
---|---|
State | New |
Headers | show |
Paolo Bonzini <pbonzini@redhat.com> writes: > It is quite difficult to debug qtest test cases without extra wrapper > scripts for QEMU or similar. This patch adds a simple environment > variable-based trigger that sends a STOP signal to the QEMU instance > under test, before attempting to connect to its QMP session. > > This will block execution of the testcase and give time to attach a > debugger to the stopped QEMU process. > > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> > --- > tests/libqtest.c | 38 +++++++++++++++++++++++++------------- > 1 file modificato, 25 inserzioni(+), 13 rimozioni(-) > > diff --git a/tests/libqtest.c b/tests/libqtest.c > index 02d0392..71b84c1 100644 > --- a/tests/libqtest.c > +++ b/tests/libqtest.c > @@ -85,6 +85,22 @@ static int socket_accept(int sock) > return ret; > } > > +static pid_t qtest_qemu_pid(QTestState *s) > +{ > + FILE *f; > + char buffer[1024]; > + pid_t pid = -1; > + > + f = fopen(s->pid_file, "r"); > + if (f) { > + if (fgets(buffer, sizeof(buffer), f)) { > + pid = atoi(buffer); > + } > + } > + fclose(f); > + return pid; > +} > + > QTestState *qtest_init(const char *extra_args) > { > QTestState *s; > @@ -136,25 +152,21 @@ QTestState *qtest_init(const char *extra_args) > qtest_qmp(s, ""); > qtest_qmp(s, "{ 'execute': 'qmp_capabilities' }"); > > + if (getenv("QTEST_STOP")) { > + kill(qtest_qemu_pid(s), SIGSTOP); > + } > + What about launching the guest with "-S" if that variable is set? That's a bit nicer, right? Regards, Anthony Liguori > return s; > } > > void qtest_quit(QTestState *s) > { > - FILE *f; > - char buffer[1024]; > - > - f = fopen(s->pid_file, "r"); > - if (f) { > - if (fgets(buffer, sizeof(buffer), f)) { > - pid_t pid = atoi(buffer); > - int status = 0; > - > - kill(pid, SIGTERM); > - waitpid(pid, &status, 0); > - } > + int status; > > - fclose(f); > + pid_t pid = qtest_qemu_pid(s); > + if (pid != -1) { > + kill(pid, SIGTERM); > + waitpid(pid, &status, 0); > } > > unlink(s->pid_file); > -- > 1.7.12
Il 01/10/2012 23:19, Anthony Liguori ha scritto: > What about launching the guest with "-S" if that variable is set? > That's a bit nicer, right? That also requires that -S block reads from the qtest socket, which is not yet the case. Paolo
Paolo Bonzini <pbonzini@redhat.com> writes: > It is quite difficult to debug qtest test cases without extra wrapper > scripts for QEMU or similar. This patch adds a simple environment > variable-based trigger that sends a STOP signal to the QEMU instance > under test, before attempting to connect to its QMP session. > > This will block execution of the testcase and give time to attach a > debugger to the stopped QEMU process. > > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Applied. Thanks. Regards, Anthony Liguori > --- > tests/libqtest.c | 38 +++++++++++++++++++++++++------------- > 1 file modificato, 25 inserzioni(+), 13 rimozioni(-) > > diff --git a/tests/libqtest.c b/tests/libqtest.c > index 02d0392..71b84c1 100644 > --- a/tests/libqtest.c > +++ b/tests/libqtest.c > @@ -85,6 +85,22 @@ static int socket_accept(int sock) > return ret; > } > > +static pid_t qtest_qemu_pid(QTestState *s) > +{ > + FILE *f; > + char buffer[1024]; > + pid_t pid = -1; > + > + f = fopen(s->pid_file, "r"); > + if (f) { > + if (fgets(buffer, sizeof(buffer), f)) { > + pid = atoi(buffer); > + } > + } > + fclose(f); > + return pid; > +} > + > QTestState *qtest_init(const char *extra_args) > { > QTestState *s; > @@ -136,25 +152,21 @@ QTestState *qtest_init(const char *extra_args) > qtest_qmp(s, ""); > qtest_qmp(s, "{ 'execute': 'qmp_capabilities' }"); > > + if (getenv("QTEST_STOP")) { > + kill(qtest_qemu_pid(s), SIGSTOP); > + } > + > return s; > } > > void qtest_quit(QTestState *s) > { > - FILE *f; > - char buffer[1024]; > - > - f = fopen(s->pid_file, "r"); > - if (f) { > - if (fgets(buffer, sizeof(buffer), f)) { > - pid_t pid = atoi(buffer); > - int status = 0; > - > - kill(pid, SIGTERM); > - waitpid(pid, &status, 0); > - } > + int status; > > - fclose(f); > + pid_t pid = qtest_qemu_pid(s); > + if (pid != -1) { > + kill(pid, SIGTERM); > + waitpid(pid, &status, 0); > } > > unlink(s->pid_file); > -- > 1.7.12
diff --git a/tests/libqtest.c b/tests/libqtest.c index 02d0392..71b84c1 100644 --- a/tests/libqtest.c +++ b/tests/libqtest.c @@ -85,6 +85,22 @@ static int socket_accept(int sock) return ret; } +static pid_t qtest_qemu_pid(QTestState *s) +{ + FILE *f; + char buffer[1024]; + pid_t pid = -1; + + f = fopen(s->pid_file, "r"); + if (f) { + if (fgets(buffer, sizeof(buffer), f)) { + pid = atoi(buffer); + } + } + fclose(f); + return pid; +} + QTestState *qtest_init(const char *extra_args) { QTestState *s; @@ -136,25 +152,21 @@ QTestState *qtest_init(const char *extra_args) qtest_qmp(s, ""); qtest_qmp(s, "{ 'execute': 'qmp_capabilities' }"); + if (getenv("QTEST_STOP")) { + kill(qtest_qemu_pid(s), SIGSTOP); + } + return s; } void qtest_quit(QTestState *s) { - FILE *f; - char buffer[1024]; - - f = fopen(s->pid_file, "r"); - if (f) { - if (fgets(buffer, sizeof(buffer), f)) { - pid_t pid = atoi(buffer); - int status = 0; - - kill(pid, SIGTERM); - waitpid(pid, &status, 0); - } + int status; - fclose(f); + pid_t pid = qtest_qemu_pid(s); + if (pid != -1) { + kill(pid, SIGTERM); + waitpid(pid, &status, 0); } unlink(s->pid_file);
It is quite difficult to debug qtest test cases without extra wrapper scripts for QEMU or similar. This patch adds a simple environment variable-based trigger that sends a STOP signal to the QEMU instance under test, before attempting to connect to its QMP session. This will block execution of the testcase and give time to attach a debugger to the stopped QEMU process. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> --- tests/libqtest.c | 38 +++++++++++++++++++++++++------------- 1 file modificato, 25 inserzioni(+), 13 rimozioni(-)