[Pdbg] [PATCH v5 4/5] main: Use hexdump to dump memory from gemem

Amitay Isaacs amitay at ozlabs.org
Wed Apr 17 15:26:00 AEST 2019


On Wed, 2019-04-17 at 15:20 +1000, Alistair Popple wrote:
> On Wednesday, 10 April 2019 6:01:50 PM AEST Amitay Isaacs wrote:
> > If getmem is being run on a terminal and if the output contains
> > non-printable characters, then use hexdump() to dump the data.
> 
> To be honest really don't like this behavior being dependent on where
> stdout 
> is going to. It seems like it would be suprising. For example if
> someone piped 
> this into grep they would expect it to be running against the hexdump
> not the 
> raw binary which could be confusing.

Fair enough. So by default it will use hexdump() unless the buffer is
printable.  And when given the extra flag, it'll be always binary.

> 
> The printable character detection is a great idea though. Can we just
> add a 
> flag to force raw binary output instead of doing it based on write
> location?
> 
> - Alistair
> 
> > Signed-off-by: Amitay Isaacs <amitay at ozlabs.org>
> > ---
> >  src/mem.c | 20 ++++++++++++++++++--
> >  1 file changed, 18 insertions(+), 2 deletions(-)
> > 
> > diff --git a/src/mem.c b/src/mem.c
> > index 8045069..b264d98 100644
> > --- a/src/mem.c
> > +++ b/src/mem.c
> > @@ -21,6 +21,7 @@
> >  #include <unistd.h>
> >  #include <assert.h>
> >  #include <stdbool.h>
> > +#include <ctype.h>
> > 
> >  #include <libpdbg.h>
> > 
> > @@ -28,6 +29,7 @@
> >  #include "progress.h"
> >  #include "optcmd.h"
> >  #include "parsers.h"
> > +#include "util.h"
> > 
> >  #define PR_ERROR(x, args...) \
> >  	pdbg_log(PDBG_ERROR, x, ##args)
> > @@ -75,8 +77,22 @@ static int _getmem(uint64_t addr, uint64_t size,
> > uint8_t
> > block_size, bool ci) }
> > 
> >  	if (count > 0) {
> > -		if (write(STDOUT_FILENO, buf, size) < 0)
> > -			PR_ERROR("Unable to write stdout.\n");
> > +		uint64_t i;
> > +		bool printable = true;
> > +
> > +		for (i=0; i<size; i++) {
> > +			if (!isprint(buf[i])) {
> > +				printable = false;
> > +				break;
> > +			}
> > +		}
> > +
> > +		if (isatty(STDOUT_FILENO) && !printable) {
> > +			hexdump(addr, buf, size, 1);
> > +		} else {
> > +			if (write(STDOUT_FILENO, buf, size) < 0)
> > +				PR_ERROR("Unable to write stdout.\n");
> > +		}
> >  	}
> > 
> >  	free(buf);
> 
> 

Amitay.
-- 

Choose a job you love, and you will never have to work a day in your life. -
Confucius



More information about the Pdbg mailing list