[PATCH 2/2] abrt-gdb-exploitable: first cut of ppc support

Jakub Filak jfilak at redhat.com
Thu Jun 27 16:21:56 UTC 2013


On Thu, 2013-06-27 at 17:09 +0200, Denys Vlasenko wrote:
> Signed-off-by: Denys Vlasenko <dvlasenk at redhat.com>
> ---
>  src/plugins/abrt-gdb-exploitable | 60 ++++++++++++++++++++++++++++++++++++++--
>  tests/abrt-exploitable/Makefile  |  4 +--
>  2 files changed, 60 insertions(+), 4 deletions(-)
> 
> diff --git a/src/plugins/abrt-gdb-exploitable b/src/plugins/abrt-gdb-exploitable
> index f33ec45..1f33061 100755
> --- a/src/plugins/abrt-gdb-exploitable
> +++ b/src/plugins/abrt-gdb-exploitable
> @@ -371,6 +371,62 @@ class SignalAndInsn:
>          self.instruction_is_store = self.x86_instruction_is_store()
>  
> 
> +    def ppc_get_instruction(self):
> +        try:
> +            # just "disassemble $pc" won't work if $pc doesn't point
> +            # inside a known function
> +            raw_instructions = gdb.execute("disassemble $pc,$pc+32", to_string=True)
> +        except gdb.error:
> +            # For example, if tracee already exited normally.
> +            # Another observed case is if $pc points to unmapped area.
> +            # We get "Python Exception <class 'gdb.error'> No registers"
> +            return
> +
> +        instructions = []
> +        current = None

Is the current variable necessary? It looks like that the current
instruction is the last item in the instructions.

> +        for line in raw_instructions.split("\n"):
> +            # line can be:
> +            # "Dump of assembler code from 0xAAAA to 0xBBBB:"
> +            # "[=>] 0x00000000004004dc[ <+0>]:  push   %rbp"
> +            #   (" <+0>" part is present when we run on a live process,
> +            #   on coredump it is absent)
> +            # "End of assembler dump."
> +            # "" (empty line)
> +            if line.startswith("=>"):
> +                line = line[2:]
> +                current = len(instructions)
> +            line = line.split(":", 1)
> +            if len(line) < 2:        # no ":"?
> +                continue
> +            line = line[1]           # drop "foo:"
> +            line = line.strip()      # drop leading/trailing whitespace
> +            if line:
> +                instructions.append(line)
> +        if current == None:

[PEP8]
if current is None: 

> +            # we determined that $pc points to a bad address,
> +            # which is an interesting fact.
> +            return
> +
> +        # There can be a disasm comment: "insn op,op,op  # comment";
> +        # strip it, and whitespace on both ends:
> +        t = instructions[current].split("#", 1)[0].strip()

I'm afraid that the current can be length(instructions) and IMHO python
indexes from 0.


> +        self.current_instruction = t
> +        # Split it into mnemonic and operands
> +        t = t.split(None, 1)
> +        self.mnemonic = t[0]
> +        if len(t) > 1:
> +            self.operands = t[1]
> +
> +        self.instruction_is_store = self.mnemonic.startswith("st")
> +        self.instruction_is_branch = self.mnemonic.startswith("b")
> +        self.instruction_is_pushing = (self.instruction_is_store and "(r1)" in self.operands)
> +        # Looks like div[o] insns on ppc don't cause exceptions
> +        # (need to check whether, and how, FPE is generated)
> +        #self.instruction_is_division =
> +        # On ppc, return insn is b[cond]lr. TODO: is cond form ever used by gcc?
> +        self.instruction_is_return = (self.mnemonic == "blr")
> +
> +
>      def get_instruction(self):
>          self.current_instruction = None
>          self.mnemonic = None
> @@ -388,8 +444,8 @@ class SignalAndInsn:
>              # The target architecture is set automatically (currently powerpc:common64)
>              if " i386" in arch:
>                  return self.x86_get_instruction()
> -            #if " powerpc" in arch:
> -            #    return self.ppc_get_instruction()
> +            if " powerpc" in arch:
> +                return self.ppc_get_instruction()
>          except gdb.error:
>              return
>  
> diff --git a/tests/abrt-exploitable/Makefile b/tests/abrt-exploitable/Makefile
> index 6672fe3..9df463c 100644
> --- a/tests/abrt-exploitable/Makefile
> +++ b/tests/abrt-exploitable/Makefile
> @@ -34,7 +34,7 @@ all: $(TESTS)
>  clean:
>  	rm -f $(TESTS)
>  
> -testlive:
> +testlive: all
>  	for t in $(TESTS); do \
>  	    echo "====="; \
>  	    echo "Test: $$t"; \
> @@ -48,7 +48,7 @@ testlive:
>  		./$$t; \
>  	done 2>&1 | tee testlive.log
>  
> -testcore:
> +testcore: all
>  	rm ./core* 2>/dev/null; \
>  	ulimit -c unlimited; \
>  	for t in $(TESTS); do \




More information about the Crash-catcher mailing list