[Pdbg] [PATCH] src/thread.c: Don't print uninitialised thread status

Alistair Popple alistair at popple.id.au
Mon Aug 13 18:39:43 AEST 2018


Depending on the selection flags passed to pdbg not all threads will be
selected. This was leading to random uninitialised values being used to print
thread status for unselected threads. Instead nothing should be printed for
those threads.

Signed-off-by: Alistair Popple <alistair at popple.id.au>
---
 src/thread.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/src/thread.c b/src/thread.c
index 4b95636..d282307 100644
--- a/src/thread.c
+++ b/src/thread.c
@@ -23,24 +23,30 @@
 #include "main.h"
 #include "optcmd.h"
 
-static int print_thread_status(struct pdbg_target *target, uint32_t index, uint64_t *arg, uint64_t *unused1)
+static int print_thread_status(struct pdbg_target *target, uint32_t index, uint64_t *arg, uint64_t *valid)
 {
 	struct thread_state *status = (struct thread_state *) arg;
 
 	status[index] = thread_status(target);
+	valid[index] = true;
 	return 1;
 }
 
 static int print_core_thread_status(struct pdbg_target *core_target, uint32_t index, uint64_t *maxindex, uint64_t *unused1)
 {
 	struct thread_state status[8];
+	uint64_t valid[8] = {0};
 	int i, rc;
 
 	printf("c%02d:  ", index);
 
 	/* TODO: This cast is gross. Need to rewrite for_each_child_target as an iterator. */
-	rc = for_each_child_target("thread", core_target, print_thread_status, (uint64_t *) &status[0], NULL);
+	rc = for_each_child_target("thread", core_target, print_thread_status, (uint64_t *) &status[0], &valid[0]);
 	for (i = 0; i <= *maxindex; i++) {
+		if (!valid[i]) {
+			printf("    ");
+			continue;
+		}
 
 		if (status[i].active)
 			printf("A");
-- 
2.11.0



More information about the Pdbg mailing list