[Crash-utility] [RFC PATCH] struct: Fix handing of percpu symbols

Aaron Tomlin atomlin at redhat.com
Tue Apr 19 12:04:01 UTC 2016


On Mon 2016-04-18 11:22 -0400, Dave Anderson wrote:

Hi Dave,

> I may be missing something, but it seems like you just need it to calculate
> cpuaddr each time through the loop, and then you're done with it.  But then
> you rewind() it, store it, and keep tmpfp open across the do_datatype_addr()
> call?  What am I missing?

sure -- but I'd prefer to avoid the use of tmpfile()/fclose() in the foor loop.
Albeit since we set OPEN_ONLY_ONCE, the following should be fine:

@@ -6138,6 +6172,8 @@ cmd_datatype_common(ulong flags)
 	}
 
 	if (cpuspec) {
+		typename = expr_type_name(sp->name);
+		ptype = typename && LASTCHAR(typename) == '*' ? 1 : 0;
 		cpus = get_cpumask_buf();
 		if (STREQ(cpuspec, ""))
 			SET_BIT(cpus, CURRENT_CONTEXT()->processor);
@@ -6227,7 +6263,20 @@ cmd_datatype_common(ulong flags)
 				continue;
 			}
 
+			if (ptype) {
+				open_tmpfile();
+				snprintf(buf, sizeof buf, "p *(%s*) 0x%lx",
+					typename, cpuaddr);
+				gdb_pass_through(buf, pc->tmpfile, GNU_RETURN_ON_ERROR);
+
+				rewind(pc->tmpfile);
+				fgets(buf, BUFSIZE, pc->tmpfile);
+				parse_line(buf, argv);
+				cpuaddr = htol(argv[3], FAULT_ON_ERROR, NULL);
+				close_tmpfile();
+			}
 			fprintf(fp, "%lx\n", cpuaddr);
+
 			do_datatype_addr(dm, cpuaddr , count,
 					 flags, memberlist, argc_members);
 		}
@@ -6245,6 +6294,9 @@ freebuf:
 
 	if (cpus)
 		FREEBUF(cpus);
+
+	if (typename)
+		FREEBUF(typename);
 }
 
 static void

-- 
Aaron Tomlin




More information about the Crash-utility mailing list