@@ -16,14 +16,22 @@ class GDBMiDebugger(Driver):
16
16
17
17
gdb_instances = None
18
18
19
- def __init__ (self , base_args , base_script_file_path , regression_args , regression_script_file_path ):
19
+ def __init__ (self , base_args , base_script_file_path , regression_args , regression_script_file_path ,
20
+ base_pid = None , regression_pid = None ):
20
21
self .base_gdb_instance = create_IDDGdbController (base_script_file_path )
21
22
self .regressed_gdb_instance = create_IDDGdbController (regression_script_file_path )
22
23
23
24
self .gdb_instances = { 'base' : self .base_gdb_instance , 'regressed' : self .regressed_gdb_instance }
24
25
25
- self .run_single_raw_command ('file ' + base_args , 'base' )
26
- self .run_single_raw_command ('file ' + regression_args , 'regressed' )
26
+ if base_pid is None :
27
+ self .run_single_raw_command ('file ' + base_args , 'base' )
28
+ else :
29
+ self .run_single_raw_command ('attach ' + base_pid , 'base' )
30
+
31
+ if regression_pid is None :
32
+ self .run_single_raw_command ('file ' + regression_args , 'regressed' )
33
+ else :
34
+ self .run_single_raw_command ('attach ' + regression_pid , 'regressed' )
27
35
28
36
dirname = os .path .dirname (__file__ )
29
37
self .run_parallel_raw_command ("source " + os .path .join (dirname , "gdb_commands.py" ))
@@ -35,23 +43,11 @@ def run_parallel_command(self, command):
35
43
36
44
# wait till base is done
37
45
raw_result = self .base_gdb_instance .recv ()
38
-
39
- # make sure all output is flushed
40
- # time.sleep(.005)
41
- self .base_gdb_instance .send ((("" ,), {"timeout_sec" : 60 }))
42
- raw_result += self .base_gdb_instance .recv ()
43
-
44
46
# parse output (base)
45
47
base_response = self .parse_command_output (raw_result )
46
48
47
49
# wait till regression is done
48
50
raw_result = self .regressed_gdb_instance .recv ()
49
-
50
- # make sure all output is flushed
51
- # time.sleep(.005)
52
- self .regressed_gdb_instance .send ((("" ,), {"timeout_sec" : 60 }))
53
- raw_result += self .regressed_gdb_instance .recv ()
54
-
55
51
# parse output regression
56
52
regressed_response = self .parse_command_output (raw_result )
57
53
@@ -72,12 +68,7 @@ def run_single_command(self, command, version):
72
68
73
69
self .gdb_instances [version ].send (((" {command}\n " .format (command = command ),), {"timeout_sec" : 60 }))
74
70
raw_result = self .gdb_instances [version ].recv ()
75
-
76
- # make sure all output is flushed
77
- # time.sleep(.005)
78
- self .gdb_instances [version ].send ((("" ,), {"timeout_sec" : 60 }))
79
- raw_result += self .gdb_instances [version ].recv ()
80
-
71
+
81
72
return self .parse_command_output (raw_result )
82
73
83
74
def run_single_special_command (self , command , version ):
@@ -87,10 +78,6 @@ def run_single_special_command(self, command, version):
87
78
self .gdb_instances [version ].send (((" {command}\n " .format (command = command ),), {"timeout_sec" : 60 }))
88
79
raw_result = self .gdb_instances [version ].recv ()
89
80
90
- # flush output
91
- self .gdb_instances [version ].send ((("" ,), {"timeout_sec" : 60 }))
92
- raw_result += self .gdb_instances [version ].recv ()
93
-
94
81
return self .parse_special_command_output (raw_result )
95
82
96
83
def parse_special_command_output (self , raw_result ):
@@ -155,20 +142,26 @@ def get_current_registers(self):
155
142
return { "base" : base_stack_frame , "regressed" : regression_stack_frame }
156
143
157
144
def run_parallel_raw_command (self , command ):
158
- base_result = str (self .run_single_raw_command (command , "base" ))
159
- regression_result = str (self .run_single_raw_command (command , "regressed" ))
145
+ self .base_gdb_instance .send ((("{command}\n " .format (command = command ),), {"timeout_sec" : 60 }))
146
+ self .regressed_gdb_instance .send ((("{command}\n " .format (command = command ),), {"timeout_sec" : 60 }))
147
+
148
+ raw_result = self .base_gdb_instance .recv ()
149
+ base_result = str (self .parse_raw_command_output (raw_result ))
150
+ raw_result = self .regressed_gdb_instance .recv ()
151
+ regression_result = str (self .parse_raw_command_output (raw_result ))
160
152
161
153
return { "base" : base_result , "regressed" : regression_result }
162
154
163
- def run_single_raw_command (self , command , version ):
155
+ def parse_raw_command_output (self , raw_result ):
164
156
result = []
165
- self .gdb_instances [version ].send ((("{command}\n " .format (command = command ),), {"timeout_sec" : 60 }))
166
- raw_result = self .gdb_instances [version ].recv ()
167
-
168
157
for item in raw_result :
169
158
result .append (str (item ))
170
-
171
159
return result
172
160
161
+ def run_single_raw_command (self , command , version ):
162
+ self .gdb_instances [version ].send ((("{command}\n " .format (command = command ),), {"timeout_sec" : 60 }))
163
+ raw_result = self .gdb_instances [version ].recv ()
164
+ return self .parse_raw_command_output (raw_result )
165
+
173
166
def terminate (self ):
174
167
terminate_all_IDDGdbController ()
0 commit comments