# python auto script
紀錄一下自動化腳本的過程,其實gdb是可以讀入python 腳本達到自動化debug的
![](https://i.imgur.com/B7DTbFY.png)
```bash=
b main
so ./test.py
```
```c=
#include <stdio.h>
int foo2(int b){
int c=0;
c=b+1;
return c;
}
int foo(int a ){
int b= a +1;
return foo2(b);
}
int main (){
for (int i = 0 ; i <100 ; i++){
printf("%d\n",foo(i));
}
return 0;
}
```
```python=
import struct
import re
pattern = r"^\s*(\S+)\s+(.*)$"
back = 0
last_addrees = 0
possiable_address = []
test ={}
gdb.execute("b test.c:13", to_string=True)
bp = gdb.breakpoints()
for x in bp :
x.silent = True
last_times= 0
for i in range(100):
last_times+=1
if(last_times <=50):
# print("eeeeeee")
gdb.execute("c")
else:
bp = gdb.breakpoints()
for x in bp :
x.silent = False
print("ffff")
frame = gdb.selected_frame()
print (hex(frame.pc()))
inferior = gdb.selected_inferior()
pc = gdb.selected_frame().pc()
opcode = inferior.read_memory(pc, 1)
print(opcode)
opcode_int = struct.unpack("=B", opcode)[0]
print("----")
print(opcode_int)
# gdb.execute("disassemble "+ str(hex(frame.pc())))
# Disassemble the instruction bytes
disassembly = gdb.execute("disassemble 0x{:x},+1".format(pc), to_string=True)
# Extract the opcode from the disassembly output
opcode = disassembly.split()[2]
print(f"Opcode at PC: {opcode}")
# print(disassembly)
arr = disassembly.split('=> ')
print(arr[1])
# result = gdb.execute("source print_V5_BTB_test.gdb", to_string=True)
# print("Result:", result)
# cycle = gdb.execute("source print_V5_BTB_test2.gdb", to_string=True)
# print("test")
# print("cycle:", cycle)
# tk = 0
# if( (int(result) -int(back) )>=2):
# tk =(int(result) -int(back))
# back = int(result)
# frame = gdb.selected_frame()
# # print("PC address:", hex(frame.pc()))
# last_addrees=hex(frame.pc())
# print(result)
# print("====================================diff")
# if (tk >=2 ):
# frame = gdb.selected_frame()
# print("PC address:", hex(frame.pc()))
# possiable_address.append(hex(frame.pc()))
# sal = gdb.find_pc_line(int(hex(frame.pc()), 16)).symtab.filename
# linesal = gdb.find_pc_line(int(hex(frame.pc()), 16)).line
# test["last pc:"+str(last_addrees)+":"+sal+":"+ str(linesal)+":mis:"+ str( tk )]=hex(frame.pc())
# bt_output = gdb.execute("bt", to_string=True)
# bt_lines = bt_output.split("\n")
# for line in bt_lines:
# if not line:
# continue
# print(line)
# print(len(test))
# for x in test:
# print("=======")
# print("diff:")
# tmp = x.split(':')
# for y in tmp:
# print(y)
# print("last address :" +str(tmp[1]))
# sal = gdb.find_pc_line(int(tmp[1], 16)).symtab.filename
# linesal = gdb.find_pc_line(int(tmp[1], 16)).line
# source ="list "+ sal+":"+ str(linesal)
# print(source)
# gdb.execute(source)
# print("==============================")
# print("now address :" +str(test[x]))
# sal = gdb.find_pc_line(int(test[x], 16)).symtab.filename
# linesal = gdb.find_pc_line(int(test[x], 16)).line
# source ="list "+ sal+":"+ str(linesal)
# print(source)
# gdb.execute(source)
# for x in possiable_address:
# print("=======")
# print("PC address:", x)
# sal = gdb.find_pc_line(int(x, 16)).symtab.filename
# linesal = gdb.find_pc_line(int(x, 16)).line
# source ="list "+ sal+":"+ str(linesal)
# print(source)
# gdb.execute(source)
gdb.execute("interrupt")
```