[ABRT PATCH 2/2 v2] abrt-gdb-exploitable: first cut of ppc support
Denys Vlasenko
dvlasenk at redhat.com
Tue Jul 2 14:33:14 UTC 2013
v2: Python style fixes
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
+ 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 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()
+ 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 \
--
1.8.1.4
More information about the Crash-catcher
mailing list