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

Alistair Popple alistair at popple.id.au
Wed Apr 17 15:20:57 AEST 2019


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.

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);




More information about the Pdbg mailing list