[Crash-utility] [PATCH] allow struct -r with a single member-specific output

Dominique Martinet asmadeus at codewreck.org
Thu Feb 6 21:07:28 UTC 2020


---
 symbols.c | 18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/symbols.c b/symbols.c
index f04e8b5..f030179 100644
--- a/symbols.c
+++ b/symbols.c
@@ -6617,17 +6617,17 @@ do_datatype_addr(struct datatype_member *dm, ulong addr, int count,
 		i = 0;
         	do {
                 	if (argc_members) {
+				if (argc_members > 1 && flags & SHOW_RAW_DATA)
+					error(FATAL,
+					      "only up to one member-specific output allowed with -r\n");
 				/* This call works fine with fields
 				 * of the second, third, ... levels.
 				 * There is no need to fix it
 				 */
 				if (!member_to_datatype(memberlist[i], dm,
-							ANON_MEMBER_QUERY))
+							(flags & SHOW_RAW_DATA) ? ANON_MEMBER_QUERY : 0))
 					error(FATAL, "invalid data structure reference: %s.%s\n",
 					      dm->name, memberlist[i]);
-				if (flags & SHOW_RAW_DATA)
-        				error(FATAL, 
-					      "member-specific output not allowed with -r\n");
 			}
 
 			/*
@@ -6636,9 +6636,13 @@ do_datatype_addr(struct datatype_member *dm, ulong addr, int count,
 			if (flags & SHOW_OFFSET) {
 				dm->vaddr = addr;
 				do_datatype_declaration(dm, flags | (dm->flags & TYPEDEF));
-			} else if (flags & SHOW_RAW_DATA)
+			} else if (flags & SHOW_RAW_DATA) {
+				if (argc_members) {
+					addr += dm->member_offset;
+					len = dm->member_size;
+				}
 				raw_data_dump(addr, len, flags & STRUCT_VERBOSE);
-			else if ((flags & DEREF_POINTERS) && !dm->member) {
+			} else if ((flags & DEREF_POINTERS) && !dm->member) {
 				print_struct_with_dereference(addr, dm, flags);
                 	} else {
 	                        if (dm->member)
@@ -6849,7 +6853,7 @@ member_to_datatype(char *s, struct datatype_member *dm, ulong flags)
 {
 	dm->member = s;
 
-	if ((dm->member_offset = MEMBER_OFFSET(dm->name, s)) >= 0)
+	if (datatype_info(dm->name, s, dm) >= 0)
 		return TRUE;
 
 	if ((flags & ANON_MEMBER_QUERY) &&
-- 
2.24.1





More information about the Crash-utility mailing list