1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
4 Copyright (C) 2007 Sébastien Granjoux
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 * Wrap each debugger commands in a command object put in a FIFO queue
23 *---------------------------------------------------------------------------*/
32 #include <libanjuta/anjuta-debug.h>
33 #include <libanjuta/interfaces/ianjuta-debugger-breakpoint.h>
34 #include <libanjuta/interfaces/ianjuta-debugger-register.h>
35 #include <libanjuta/interfaces/ianjuta-debugger-memory.h>
36 #include <libanjuta/interfaces/ianjuta-debugger-instruction.h>
37 #include <libanjuta/interfaces/ianjuta-debugger-variable.h>
44 *---------------------------------------------------------------------------*/
47 *---------------------------------------------------------------------------*/
53 LOAD_COMMAND
, /* Debugger started */
55 QUIT_COMMAND
, /* Debugger started - Program stopped */
58 INSPECT_MEMORY_COMMAND
,
60 LIST_REGISTER_COMMAND
,
61 SET_WORKING_DIRECTORY_COMMAND
,
62 SET_ENVIRONMENT_COMMAND
,
63 UNLOAD_COMMAND
, /* Program loaded */
66 BREAK_LINE_COMMAND
, /* Program loaded - Program stopped */
67 BREAK_FUNCTION_COMMAND
, /* 0x10 */
68 BREAK_ADDRESS_COMMAND
,
71 CONDITION_BREAK_COMMAND
,
74 INFO_SHAREDLIB_COMMAND
,
75 STEP_IN_COMMAND
, /* Program stopped */
83 RUN_TO_ADDRESS_COMMAND
, /* 0x20 */
84 RUN_FROM_ADDRESS_COMMAND
,
86 HANDLE_SIGNAL_COMMAND
,
95 DUMP_STACK_TRACE_COMMAND
,
96 UPDATE_REGISTER_COMMAND
,
97 WRITE_REGISTER_COMMAND
,
99 INSPECT_COMMAND
, /* 0x30 */
103 LIST_VARIABLE_CHILDREN
,
107 INTERRUPT_COMMAND
/* Program running */
108 } DmaDebuggerCommandType
;
112 DMA_CALLBACK_COMMAND
=
114 NEED_DEBUGGER_STOPPED
| NEED_DEBUGGER_STARTED
| NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
116 LOAD_COMMAND
| LOAD_PROGRAM
|
117 NEED_DEBUGGER_STOPPED
| NEED_DEBUGGER_STARTED
,
119 ATTACH_COMMAND
| RUN_PROGRAM
|
120 NEED_DEBUGGER_STOPPED
| NEED_DEBUGGER_STARTED
,
122 QUIT_COMMAND
| CANCEL_ALL_COMMAND
| STOP_DEBUGGER
|
123 HIGH_PRIORITY
| NEED_DEBUGGER_STARTED
| NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
125 ABORT_COMMAND
| CANCEL_ALL_COMMAND
| STOP_DEBUGGER
|
126 ASYNCHRONOUS
| NEED_DEBUGGER_STARTED
| NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
129 NEED_DEBUGGER_STARTED
| NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
130 DMA_INSPECT_MEMORY_COMMAND
=
131 INSPECT_MEMORY_COMMAND
|
132 NEED_DEBUGGER_STARTED
| NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
133 DMA_DISASSEMBLE_COMMAND
=
134 DISASSEMBLE_COMMAND
|
135 NEED_DEBUGGER_STARTED
| NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
136 DMA_LIST_REGISTER_COMMAND
=
137 LIST_REGISTER_COMMAND
|
138 NEED_DEBUGGER_STARTED
| NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
139 DMA_SET_WORKING_DIRECTORY_COMMAND
=
140 SET_WORKING_DIRECTORY_COMMAND
|
141 NEED_DEBUGGER_STARTED
| NEED_PROGRAM_LOADED
,
142 DMA_SET_ENVIRONMENT_COMMAND
=
143 SET_ENVIRONMENT_COMMAND
|
144 NEED_DEBUGGER_STARTED
| NEED_PROGRAM_LOADED
,
146 UNLOAD_COMMAND
| START_DEBUGGER
|
147 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
149 START_COMMAND
| RUN_PROGRAM
|
150 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
151 DMA_CONNECT_COMMAND
=
152 CONNECT_COMMAND
| RUN_PROGRAM
|
153 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
154 DMA_BREAK_LINE_COMMAND
=
156 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
157 DMA_BREAK_FUNCTION_COMMAND
=
158 BREAK_FUNCTION_COMMAND
|
159 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
160 DMA_BREAK_ADDRESS_COMMAND
=
161 BREAK_ADDRESS_COMMAND
|
162 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
163 DMA_ENABLE_BREAK_COMMAND
=
164 ENABLE_BREAK_COMMAND
|
165 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
166 DMA_IGNORE_BREAK_COMMAND
=
167 IGNORE_BREAK_COMMAND
|
168 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
169 DMA_CONDITION_BREAK_COMMAND
=
170 CONDITION_BREAK_COMMAND
|
171 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
172 DMA_REMOVE_BREAK_COMMAND
=
173 REMOVE_BREAK_COMMAND
|
174 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
175 DMA_LIST_BREAK_COMMAND
=
177 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
178 DMA_INFO_SHAREDLIB_COMMAND
=
179 INFO_SHAREDLIB_COMMAND
|
180 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
181 DMA_STEP_IN_COMMAND
=
182 STEP_IN_COMMAND
| RUN_PROGRAM
|
183 NEED_PROGRAM_STOPPED
,
184 DMA_STEP_OVER_COMMAND
=
185 STEP_OVER_COMMAND
| RUN_PROGRAM
|
186 NEED_PROGRAM_STOPPED
,
187 DMA_STEP_OUT_COMMAND
=
188 STEP_OUT_COMMAND
| RUN_PROGRAM
|
189 NEED_PROGRAM_STOPPED
,
191 RUN_COMMAND
| RUN_PROGRAM
|
192 NEED_PROGRAM_STOPPED
,
194 RUN_TO_COMMAND
| RUN_PROGRAM
|
195 NEED_PROGRAM_STOPPED
,
196 DMA_RUN_FROM_COMMAND
=
197 RUN_FROM_COMMAND
| RUN_PROGRAM
|
198 NEED_PROGRAM_STOPPED
,
199 DMA_STEPI_IN_COMMAND
=
200 STEPI_IN_COMMAND
| RUN_PROGRAM
|
201 NEED_PROGRAM_STOPPED
,
202 DMA_STEPI_OVER_COMMAND
=
203 STEPI_OVER_COMMAND
| RUN_PROGRAM
|
204 NEED_PROGRAM_STOPPED
,
205 DMA_RUN_TO_ADDRESS_COMMAND
=
206 RUN_TO_ADDRESS_COMMAND
| RUN_PROGRAM
|
207 NEED_PROGRAM_STOPPED
,
208 DMA_RUN_FROM_ADDRESS_COMMAND
=
209 RUN_FROM_ADDRESS_COMMAND
| RUN_PROGRAM
|
210 NEED_PROGRAM_STOPPED
,
212 EXIT_COMMAND
| LOAD_PROGRAM
|
213 NEED_PROGRAM_STOPPED
,
214 DMA_HANDLE_SIGNAL_COMMAND
=
215 HANDLE_SIGNAL_COMMAND
|
216 NEED_PROGRAM_STOPPED
,
217 DMA_LIST_LOCAL_COMMAND
=
219 NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
220 DMA_LIST_ARG_COMMAND
=
222 NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
223 DMA_LIST_THREAD_COMMAND
=
224 LIST_THREAD_COMMAND
|
225 NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
226 DMA_SET_THREAD_COMMAND
=
228 NEED_PROGRAM_STOPPED
,
229 DMA_INFO_THREAD_COMMAND
=
230 INFO_THREAD_COMMAND
|
231 NEED_PROGRAM_STOPPED
,
232 DMA_INFO_SIGNAL_COMMAND
=
233 INFO_SIGNAL_COMMAND
|
234 NEED_PROGRAM_STOPPED
,
235 DMA_SET_FRAME_COMMAND
=
237 NEED_PROGRAM_STOPPED
,
238 DMA_LIST_FRAME_COMMAND
=
240 NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
241 DMA_DUMP_STACK_TRACE_COMMAND
=
242 DUMP_STACK_TRACE_COMMAND
|
243 NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
244 DMA_UPDATE_REGISTER_COMMAND
=
245 UPDATE_REGISTER_COMMAND
|
246 NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
247 DMA_WRITE_REGISTER_COMMAND
=
248 WRITE_REGISTER_COMMAND
|
249 NEED_PROGRAM_STOPPED
,
250 DMA_EVALUATE_COMMAND
=
252 NEED_PROGRAM_STOPPED
,
253 DMA_INSPECT_COMMAND
=
255 NEED_PROGRAM_STOPPED
,
258 NEED_PROGRAM_STOPPED
,
259 DMA_CREATE_VARIABLE_COMMAND
=
261 NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
262 DMA_EVALUATE_VARIABLE_COMMAND
=
263 EVALUATE_VARIABLE
| CANCEL_IF_PROGRAM_RUNNING
|
264 NEED_PROGRAM_STOPPED
,
265 DMA_LIST_VARIABLE_CHILDREN_COMMAND
=
266 LIST_VARIABLE_CHILDREN
|
267 NEED_PROGRAM_STOPPED
,
268 DMA_DELETE_VARIABLE_COMMAND
=
270 NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
271 DMA_ASSIGN_VARIABLE_COMMAND
=
273 NEED_PROGRAM_STOPPED
,
274 DMA_UPDATE_VARIABLE_COMMAND
=
275 UPDATE_VARIABLE
| CANCEL_IF_PROGRAM_RUNNING
|
276 NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
277 /* DMA_INTERRUPT_COMMAND doesn't automatically go in stop-program state
278 * because sometimes it doesn't work. I don't know if it comes from anjuta,
279 * anjuta-launcher, vte or gdb */
280 DMA_INTERRUPT_COMMAND
=
282 ASYNCHRONOUS
| NEED_PROGRAM_RUNNING
,
283 } DmaDebuggerCommand
;
285 struct _DmaQueueCommand
287 DmaDebuggerCommandType type
;
288 IAnjutaDebuggerCallback callback
;
354 struct _DmaQueueCommand
*next
;
358 *---------------------------------------------------------------------------*/
360 static DmaQueueCommand
*
361 dma_command_new (DmaDebuggerCommand cmd_type
,...)
363 DmaQueueCommand
* cmd
;
364 DmaDebuggerCommandType type
= cmd_type
& COMMAND_MASK
;
365 IAnjutaDebuggerRegisterData
* reg
;
369 cmd
= g_new0 (DmaQueueCommand
, 1);
370 cmd
->type
= cmd_type
;
372 va_start (args
, cmd_type
);
377 case CALLBACK_COMMAND
:
378 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
379 cmd
->user_data
= va_arg (args
, gpointer
);
382 cmd
->data
.load
.file
= g_strdup (va_arg (args
, gchar
*));
383 cmd
->data
.load
.type
= g_strdup (va_arg (args
, gchar
*));
384 cmd
->data
.load
.dirs
= NULL
;
385 for (list
= va_arg (args
, GList
*); list
!= NULL
; list
= g_list_next (list
))
387 cmd
->data
.load
.dirs
= g_list_prepend (cmd
->data
.load
.dirs
, g_strdup (list
->data
));
389 cmd
->data
.load
.dirs
= g_list_reverse (cmd
->data
.load
.dirs
);
392 cmd
->data
.attach
.pid
= va_arg (args
,pid_t
);
393 cmd
->data
.load
.dirs
= NULL
;
394 for (list
= va_arg (args
, GList
*); list
!= NULL
; list
= g_list_next (list
))
396 cmd
->data
.load
.dirs
= g_list_prepend (cmd
->data
.load
.dirs
, g_strdup (list
->data
));
398 cmd
->data
.load
.dirs
= g_list_reverse (cmd
->data
.load
.dirs
);
406 case SET_WORKING_DIRECTORY_COMMAND
:
407 cmd
->data
.dir
= g_strdup (va_arg (args
, gchar
*));
409 case SET_ENVIRONMENT_COMMAND
:
410 cmd
->data
.env
= g_strdupv (va_arg (args
, gchar
**));
413 cmd
->data
.start
.args
= g_strdup (va_arg (args
, gchar
*));
414 cmd
->data
.start
.terminal
= va_arg (args
, gboolean
);
415 cmd
->data
.start
.stop
= va_arg (args
, gboolean
);
417 case CONNECT_COMMAND
:
418 cmd
->data
.start
.server
= g_strdup (va_arg (args
, gchar
*));
419 cmd
->data
.start
.args
= g_strdup (va_arg (args
, gchar
*));
420 cmd
->data
.start
.terminal
= va_arg (args
, gboolean
);
421 cmd
->data
.start
.stop
= va_arg (args
, gboolean
);
426 cmd
->data
.pos
.file
= g_strdup (va_arg (args
, gchar
*));
427 cmd
->data
.pos
.line
= va_arg (args
, guint
);
429 case RUN_FROM_COMMAND
:
430 cmd
->data
.pos
.file
= g_strdup (va_arg (args
, gchar
*));
431 cmd
->data
.pos
.line
= va_arg (args
, guint
);
433 case STEP_IN_COMMAND
:
435 case STEP_OVER_COMMAND
:
437 case STEP_OUT_COMMAND
:
439 case RUN_TO_ADDRESS_COMMAND
:
440 cmd
->data
.pos
.address
= va_arg (args
, guint
);
442 case RUN_FROM_ADDRESS_COMMAND
:
443 cmd
->data
.pos
.address
= va_arg (args
, guint
);
445 case STEPI_IN_COMMAND
:
447 case STEPI_OVER_COMMAND
:
451 case INTERRUPT_COMMAND
:
453 case ENABLE_BREAK_COMMAND
:
454 cmd
->data
.brk
.id
= va_arg (args
, gint
);
455 cmd
->data
.brk
.enable
= va_arg (args
, gboolean
);
456 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
457 cmd
->user_data
= va_arg (args
, gpointer
);
459 case IGNORE_BREAK_COMMAND
:
460 cmd
->data
.brk
.id
= va_arg (args
, gint
);
461 cmd
->data
.brk
.ignore
= va_arg (args
, guint
);
462 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
463 cmd
->user_data
= va_arg (args
, gpointer
);
465 case REMOVE_BREAK_COMMAND
:
466 cmd
->data
.brk
.id
= va_arg (args
, gint
);
467 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
468 cmd
->user_data
= va_arg (args
, gpointer
);
470 case BREAK_LINE_COMMAND
:
471 cmd
->data
.pos
.id
= va_arg (args
, guint
*);
472 cmd
->data
.pos
.file
= g_strdup (va_arg (args
, gchar
*));
473 cmd
->data
.pos
.line
= va_arg (args
, guint
);
474 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
475 cmd
->user_data
= va_arg (args
, gpointer
);
477 case BREAK_FUNCTION_COMMAND
:
478 cmd
->data
.pos
.id
= va_arg (args
, guint
*);
479 cmd
->data
.pos
.file
= g_strdup (va_arg (args
, gchar
*));
480 cmd
->data
.pos
.function
= g_strdup (va_arg (args
, gchar
*));
481 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
482 cmd
->user_data
= va_arg (args
, gpointer
);
484 case BREAK_ADDRESS_COMMAND
:
485 cmd
->data
.pos
.id
= va_arg (args
, guint
*);
486 cmd
->data
.pos
.address
= va_arg (args
, gulong
);
487 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
488 cmd
->user_data
= va_arg (args
, gpointer
);
490 case CONDITION_BREAK_COMMAND
:
491 cmd
->data
.brk
.id
= va_arg (args
, gint
);
492 cmd
->data
.brk
.condition
= g_strdup (va_arg (args
, gchar
*));
493 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
494 cmd
->user_data
= va_arg (args
, gpointer
);
496 case LIST_BREAK_COMMAND
:
497 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
498 cmd
->user_data
= va_arg (args
, gpointer
);
500 case INSPECT_COMMAND
:
501 cmd
->data
.watch
.name
= g_strdup (va_arg (args
, gchar
*));
502 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
503 cmd
->user_data
= va_arg (args
, gpointer
);
505 case EVALUATE_COMMAND
:
506 cmd
->data
.watch
.name
= g_strdup (va_arg (args
, gchar
*));
507 cmd
->data
.watch
.value
= g_strdup (va_arg (args
, gchar
*));
508 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
509 cmd
->user_data
= va_arg (args
, gpointer
);
511 case LIST_LOCAL_COMMAND
:
512 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
513 cmd
->user_data
= va_arg (args
, gpointer
);
515 case LIST_ARG_COMMAND
:
516 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
517 cmd
->user_data
= va_arg (args
, gpointer
);
519 case LIST_THREAD_COMMAND
:
520 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
521 cmd
->user_data
= va_arg (args
, gpointer
);
523 case SET_THREAD_COMMAND
:
524 cmd
->data
.frame
.frame
= va_arg (args
, guint
);
526 case INFO_THREAD_COMMAND
:
527 cmd
->data
.info
.id
= va_arg (args
, guint
);
528 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
529 cmd
->user_data
= va_arg (args
, gpointer
);
531 case INFO_SIGNAL_COMMAND
:
532 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
533 cmd
->user_data
= va_arg (args
, gpointer
);
535 case INFO_SHAREDLIB_COMMAND
:
536 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
537 cmd
->user_data
= va_arg (args
, gpointer
);
539 case SET_FRAME_COMMAND
:
540 cmd
->data
.frame
.frame
= va_arg (args
, guint
);
542 case LIST_FRAME_COMMAND
:
543 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
544 cmd
->user_data
= va_arg (args
, gpointer
);
546 case DUMP_STACK_TRACE_COMMAND
:
547 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
548 cmd
->user_data
= va_arg (args
, gpointer
);
550 case LIST_REGISTER_COMMAND
:
551 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
552 cmd
->user_data
= va_arg (args
, gpointer
);
554 case UPDATE_REGISTER_COMMAND
:
555 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
556 cmd
->user_data
= va_arg (args
, gpointer
);
558 case WRITE_REGISTER_COMMAND
:
559 reg
= va_arg (args
, IAnjutaDebuggerRegisterData
*);
560 cmd
->data
.watch
.id
= reg
->num
;
561 cmd
->data
.watch
.name
= g_strdup (reg
->name
);
562 cmd
->data
.watch
.value
= g_strdup (reg
->value
);
564 case INSPECT_MEMORY_COMMAND
:
565 cmd
->data
.mem
.address
= va_arg (args
, gulong
);
566 cmd
->data
.mem
.length
= va_arg (args
, guint
);
567 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
568 cmd
->user_data
= va_arg (args
, gpointer
);
570 case DISASSEMBLE_COMMAND
:
571 cmd
->data
.mem
.address
= va_arg (args
, gulong
);
572 cmd
->data
.mem
.length
= va_arg (args
, guint
);
573 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
574 cmd
->user_data
= va_arg (args
, gpointer
);
577 cmd
->data
.user
.cmd
= g_strdup (va_arg (args
, gchar
*));
580 cmd
->data
.print
.var
= g_strdup (va_arg (args
, gchar
*));
581 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
582 cmd
->user_data
= va_arg (args
, gpointer
);
584 case HANDLE_SIGNAL_COMMAND
:
585 cmd
->data
.signal
.name
= g_strdup (va_arg (args
, gchar
*));
586 cmd
->data
.signal
.stop
= va_arg (args
, gboolean
);
587 cmd
->data
.signal
.print
= va_arg (args
, gboolean
);
588 cmd
->data
.signal
.ignore
= va_arg (args
, gboolean
);
590 case DELETE_VARIABLE
:
591 cmd
->data
.var
.name
= g_strdup (va_arg (args
, gchar
*));
593 case ASSIGN_VARIABLE
:
594 cmd
->data
.var
.name
= g_strdup (va_arg (args
, gchar
*));
595 cmd
->data
.var
.value
= g_strdup (va_arg (args
, gchar
*));
597 case EVALUATE_VARIABLE
:
598 cmd
->data
.var
.name
= g_strdup (va_arg (args
, gchar
*));
599 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
600 cmd
->user_data
= va_arg (args
, gpointer
);
602 case LIST_VARIABLE_CHILDREN
:
603 cmd
->data
.var
.name
= g_strdup (va_arg (args
, gchar
*));
604 cmd
->data
.var
.from
= (va_arg (args
, guint
));
605 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
606 cmd
->user_data
= va_arg (args
, gpointer
);
608 case CREATE_VARIABLE
:
609 cmd
->data
.var
.name
= g_strdup (va_arg (args
, gchar
*));
610 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
611 cmd
->user_data
= va_arg (args
, gpointer
);
613 case UPDATE_VARIABLE
:
614 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
615 cmd
->user_data
= va_arg (args
, gpointer
);
624 *---------------------------------------------------------------------------*/
627 dma_queue_load (DmaDebuggerQueue
*self
, const gchar
*file
, const gchar
* mime_type
, const GList
*search_dirs
)
629 if (!dma_debugger_queue_start (self
, mime_type
)) return FALSE
;
631 return dma_debugger_queue_append (self
, dma_command_new (DMA_LOAD_COMMAND
, file
, mime_type
, search_dirs
));
635 dma_queue_attach (DmaDebuggerQueue
*self
, pid_t pid
, const GList
*search_dirs
)
637 if (!dma_debugger_queue_start (self
, NULL
)) return FALSE
;
639 return dma_debugger_queue_append (self
, dma_command_new (DMA_ATTACH_COMMAND
, pid
, search_dirs
));
643 dma_queue_set_working_directory(DmaDebuggerQueue
*self
, const gchar
*directory
)
645 return dma_debugger_queue_append (self
, dma_command_new (DMA_SET_WORKING_DIRECTORY_COMMAND
, directory
));
649 dma_queue_set_environment(DmaDebuggerQueue
*self
, gchar
**variables
)
651 return dma_debugger_queue_append (self
, dma_command_new (DMA_SET_ENVIRONMENT_COMMAND
, variables
));
655 dma_queue_start (DmaDebuggerQueue
*self
, const gchar
*args
, gboolean terminal
, gboolean stop
)
657 return dma_debugger_queue_append (self
, dma_command_new (DMA_START_COMMAND
, args
, terminal
, stop
));
661 dma_queue_connect (DmaDebuggerQueue
*self
, const gchar
*server
, const gchar
*args
, gboolean terminal
, gboolean stop
)
663 return dma_debugger_queue_append (self
, dma_command_new (DMA_CONNECT_COMMAND
, server
, args
, terminal
, stop
));
667 dma_queue_unload (DmaDebuggerQueue
*self
)
669 return dma_debugger_queue_append (self
, dma_command_new (DMA_UNLOAD_COMMAND
));
673 dma_queue_quit (DmaDebuggerQueue
*self
)
675 return dma_debugger_queue_append (self
, dma_command_new (DMA_QUIT_COMMAND
));
679 dma_queue_abort (DmaDebuggerQueue
*self
)
681 return dma_debugger_queue_append (self
, dma_command_new (DMA_ABORT_COMMAND
));
685 dma_queue_run (DmaDebuggerQueue
*self
)
687 return dma_debugger_queue_append (self
, dma_command_new (DMA_RUN_COMMAND
));
691 dma_queue_step_in (DmaDebuggerQueue
*self
)
693 return dma_debugger_queue_append (self
, dma_command_new (DMA_STEP_IN_COMMAND
));
697 dma_queue_step_over (DmaDebuggerQueue
*self
)
699 return dma_debugger_queue_append (self
, dma_command_new (DMA_STEP_OVER_COMMAND
));
703 dma_queue_run_to (DmaDebuggerQueue
*self
, const gchar
*file
, gint line
)
705 return dma_debugger_queue_append (self
, dma_command_new (DMA_RUN_TO_COMMAND
, file
, line
));
709 dma_queue_run_from (DmaDebuggerQueue
*self
, const gchar
*file
, gint line
)
711 return dma_debugger_queue_append (self
, dma_command_new (DMA_RUN_FROM_COMMAND
, file
, line
));
715 dma_queue_step_out (DmaDebuggerQueue
*self
)
717 return dma_debugger_queue_append (self
, dma_command_new (DMA_STEP_OUT_COMMAND
));
721 dma_queue_stepi_in (DmaDebuggerQueue
*self
)
723 return dma_debugger_queue_append (self
, dma_command_new (DMA_STEPI_IN_COMMAND
));
727 dma_queue_stepi_over (DmaDebuggerQueue
*self
)
729 return dma_debugger_queue_append (self
, dma_command_new (DMA_STEPI_OVER_COMMAND
));
733 dma_queue_run_to_address (DmaDebuggerQueue
*self
, gulong address
)
735 return dma_debugger_queue_append (self
, dma_command_new (DMA_RUN_TO_ADDRESS_COMMAND
, address
));
739 dma_queue_run_from_address (DmaDebuggerQueue
*self
, gulong address
)
741 return dma_debugger_queue_append (self
, dma_command_new (DMA_RUN_FROM_ADDRESS_COMMAND
, address
));
745 dma_queue_exit (DmaDebuggerQueue
*self
)
747 return dma_debugger_queue_append (self
, dma_command_new (DMA_EXIT_COMMAND
));
751 dma_queue_interrupt (DmaDebuggerQueue
*self
)
753 return dma_debugger_queue_append (self
, dma_command_new (DMA_INTERRUPT_COMMAND
));
757 dma_queue_inspect (DmaDebuggerQueue
*self
, const gchar
*expression
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
759 return dma_debugger_queue_append (self
, dma_command_new (DMA_INSPECT_COMMAND
, expression
, callback
, user_data
));
763 dma_queue_evaluate (DmaDebuggerQueue
*self
, const gchar
*name
, const gchar
* value
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
765 return dma_debugger_queue_append (self
, dma_command_new (DMA_EVALUATE_COMMAND
, name
, value
, callback
, user_data
));
769 dma_queue_send_command (DmaDebuggerQueue
*self
, const gchar
* command
)
771 return dma_debugger_queue_append (self
, dma_command_new (DMA_USER_COMMAND
, command
));
775 dma_queue_print (DmaDebuggerQueue
*self
, const gchar
* variable
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
777 return dma_debugger_queue_append (self
, dma_command_new (DMA_PRINT_COMMAND
, variable
, callback
, user_data
));
781 dma_queue_list_local (DmaDebuggerQueue
*self
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
783 return dma_debugger_queue_append (self
, dma_command_new (DMA_LIST_LOCAL_COMMAND
, callback
, user_data
));
787 dma_queue_list_argument (DmaDebuggerQueue
*self
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
789 return dma_debugger_queue_append (self
, dma_command_new (DMA_LIST_ARG_COMMAND
, callback
, user_data
));
793 dma_queue_list_thread (DmaDebuggerQueue
*self
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
795 return dma_debugger_queue_append (self
, dma_command_new (DMA_LIST_THREAD_COMMAND
, callback
, user_data
));
799 dma_queue_set_thread (DmaDebuggerQueue
*self
, gint thread
)
801 return dma_debugger_queue_append (self
, dma_command_new (DMA_SET_THREAD_COMMAND
, thread
));
805 dma_queue_info_thread (DmaDebuggerQueue
*self
, gint thread
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
807 return dma_debugger_queue_append (self
, dma_command_new (DMA_INFO_THREAD_COMMAND
, thread
, callback
, user_data
));
811 dma_queue_info_signal (DmaDebuggerQueue
*self
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
813 return dma_debugger_queue_append (self
, dma_command_new (DMA_INFO_SIGNAL_COMMAND
, callback
, user_data
));
817 dma_queue_info_sharedlib (DmaDebuggerQueue
*self
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
819 return dma_debugger_queue_append (self
, dma_command_new (DMA_INFO_SHAREDLIB_COMMAND
, callback
, user_data
));
823 dma_queue_handle_signal (DmaDebuggerQueue
*self
, const gchar
* name
, gboolean stop
, gboolean print
, gboolean ignore
)
825 return dma_debugger_queue_append (self
, dma_command_new (DMA_HANDLE_SIGNAL_COMMAND
, name
, stop
, print
, ignore
));
829 dma_queue_set_frame (DmaDebuggerQueue
*self
, guint frame
)
831 return dma_debugger_queue_append (self
, dma_command_new (DMA_SET_FRAME_COMMAND
, frame
));
835 dma_queue_list_frame (DmaDebuggerQueue
*self
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
837 return dma_debugger_queue_append (self
, dma_command_new (DMA_LIST_FRAME_COMMAND
, callback
, user_data
));
841 dma_queue_dump_stack_trace (DmaDebuggerQueue
*self
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
843 return dma_debugger_queue_append (self
, dma_command_new (DMA_DUMP_STACK_TRACE_COMMAND
, callback
, user_data
));
847 dma_queue_callback (DmaDebuggerQueue
*self
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
849 return dma_debugger_queue_append (self
, dma_command_new (DMA_CALLBACK_COMMAND
, callback
, user_data
));
853 dma_queue_add_breakpoint_at_line (DmaDebuggerQueue
*self
, guint
*id
, const gchar
* file
, guint line
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
855 return dma_debugger_queue_append (self
, dma_command_new (DMA_BREAK_LINE_COMMAND
, id
, file
, line
, callback
, user_data
));
859 dma_queue_add_breakpoint_at_function (DmaDebuggerQueue
*self
, guint
*id
, const gchar
* file
, const gchar
* function
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
861 return dma_debugger_queue_append (self
, dma_command_new (DMA_BREAK_FUNCTION_COMMAND
, id
, file
, function
, callback
, user_data
));
865 dma_queue_add_breakpoint_at_address (DmaDebuggerQueue
*self
, guint
*id
, gulong address
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
867 return dma_debugger_queue_append (self
, dma_command_new (DMA_BREAK_ADDRESS_COMMAND
, id
, address
, callback
, user_data
));
871 dma_queue_enable_breakpoint (DmaDebuggerQueue
*self
, guint id
, gboolean enable
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
873 return dma_debugger_queue_append (self
, dma_command_new (DMA_ENABLE_BREAK_COMMAND
, id
, enable
, callback
, user_data
));
877 dma_queue_ignore_breakpoint (DmaDebuggerQueue
*self
, guint id
, guint ignore
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
879 return dma_debugger_queue_append (self
, dma_command_new (DMA_IGNORE_BREAK_COMMAND
, id
, ignore
, callback
, user_data
));
883 dma_queue_condition_breakpoint (DmaDebuggerQueue
*self
, guint id
, const gchar
*condition
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
885 return dma_debugger_queue_append (self
, dma_command_new (DMA_CONDITION_BREAK_COMMAND
, id
, condition
, callback
, user_data
));
889 dma_queue_remove_breakpoint (DmaDebuggerQueue
*self
, guint id
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
891 return dma_debugger_queue_append (self
, dma_command_new (DMA_REMOVE_BREAK_COMMAND
, id
, callback
, user_data
));
895 dma_queue_list_breakpoint (DmaDebuggerQueue
*self
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
897 return dma_debugger_queue_append (self
, dma_command_new (DMA_LIST_BREAK_COMMAND
, callback
, user_data
));
901 dma_queue_list_register (DmaDebuggerQueue
*self
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
903 return dma_debugger_queue_append (self
, dma_command_new (DMA_LIST_REGISTER_COMMAND
, callback
, user_data
));
907 dma_queue_update_register (DmaDebuggerQueue
*self
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
909 return dma_debugger_queue_append (self
, dma_command_new (DMA_UPDATE_REGISTER_COMMAND
, callback
, user_data
));
913 dma_queue_write_register (DmaDebuggerQueue
*self
, IAnjutaDebuggerRegisterData
*value
)
915 return dma_debugger_queue_append (self
, dma_command_new (DMA_WRITE_REGISTER_COMMAND
, value
));
919 dma_queue_inspect_memory (DmaDebuggerQueue
*self
, gulong address
, guint length
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
921 return dma_debugger_queue_append (self
, dma_command_new (DMA_INSPECT_MEMORY_COMMAND
, address
, length
, callback
, user_data
));
925 dma_queue_disassemble (DmaDebuggerQueue
*self
, gulong address
, guint length
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
927 return dma_debugger_queue_append (self
, dma_command_new (DMA_DISASSEMBLE_COMMAND
, address
, length
, callback
, user_data
));
931 dma_queue_delete_variable (DmaDebuggerQueue
*self
, const gchar
*name
)
933 return dma_debugger_queue_append (self
, dma_command_new (DMA_DELETE_VARIABLE_COMMAND
, name
));
937 dma_queue_evaluate_variable (DmaDebuggerQueue
*self
, const gchar
*name
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
939 return dma_debugger_queue_append (self
, dma_command_new (DMA_EVALUATE_VARIABLE_COMMAND
, name
, callback
, user_data
));
943 dma_queue_assign_variable (DmaDebuggerQueue
*self
, const gchar
*name
, const gchar
*value
)
945 return dma_debugger_queue_append (self
, dma_command_new (DMA_ASSIGN_VARIABLE_COMMAND
, name
, value
));
949 dma_queue_list_children (DmaDebuggerQueue
*self
, const gchar
*name
, guint from
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
951 return dma_debugger_queue_append (self
, dma_command_new (DMA_LIST_VARIABLE_CHILDREN_COMMAND
, name
, from
, callback
, user_data
));
955 dma_queue_create_variable (DmaDebuggerQueue
*self
, const gchar
*name
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
957 return dma_debugger_queue_append (self
, dma_command_new (DMA_CREATE_VARIABLE_COMMAND
, name
, callback
, user_data
));
961 dma_queue_update_variable (DmaDebuggerQueue
*self
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
963 return dma_debugger_queue_append (self
, dma_command_new (DMA_UPDATE_VARIABLE_COMMAND
, callback
, user_data
));
967 dma_command_free (DmaQueueCommand
*cmd
)
969 DmaDebuggerCommandType type
= cmd
->type
& COMMAND_MASK
;
974 case CALLBACK_COMMAND
:
979 case STEP_IN_COMMAND
:
980 case STEP_OVER_COMMAND
:
981 case STEP_OUT_COMMAND
:
982 case STEPI_IN_COMMAND
:
983 case STEPI_OVER_COMMAND
:
984 case RUN_TO_ADDRESS_COMMAND
:
985 case RUN_FROM_ADDRESS_COMMAND
:
987 case INTERRUPT_COMMAND
:
988 case ENABLE_BREAK_COMMAND
:
989 case IGNORE_BREAK_COMMAND
:
990 case REMOVE_BREAK_COMMAND
:
991 case LIST_BREAK_COMMAND
:
993 case LIST_LOCAL_COMMAND
:
994 case LIST_ARG_COMMAND
:
995 case INFO_THREAD_COMMAND
:
996 case LIST_THREAD_COMMAND
:
997 case SET_THREAD_COMMAND
:
998 case INFO_SIGNAL_COMMAND
:
999 case INFO_SHAREDLIB_COMMAND
:
1000 case LIST_REGISTER_COMMAND
:
1001 case UPDATE_REGISTER_COMMAND
:
1003 case SET_FRAME_COMMAND
:
1004 case LIST_FRAME_COMMAND
:
1005 case DUMP_STACK_TRACE_COMMAND
:
1006 case INSPECT_MEMORY_COMMAND
:
1007 case DISASSEMBLE_COMMAND
:
1009 case INSPECT_COMMAND
:
1010 case EVALUATE_COMMAND
:
1011 case WRITE_REGISTER_COMMAND
:
1012 if (cmd
->data
.watch
.name
!= NULL
) g_free (cmd
->data
.watch
.name
);
1013 if (cmd
->data
.watch
.value
!= NULL
) g_free (cmd
->data
.watch
.value
);
1016 case CONNECT_COMMAND
:
1017 if (cmd
->data
.start
.server
) g_free (cmd
->data
.start
.server
);
1018 if (cmd
->data
.start
.args
) g_free (cmd
->data
.start
.args
);
1021 if (cmd
->data
.load
.file
) g_free (cmd
->data
.load
.file
);
1022 if (cmd
->data
.load
.type
) g_free (cmd
->data
.load
.type
);
1023 g_list_foreach (cmd
->data
.load
.dirs
, (GFunc
)g_free
, NULL
);
1024 g_list_free (cmd
->data
.load
.dirs
);
1026 case SET_WORKING_DIRECTORY_COMMAND
:
1027 if (cmd
->data
.dir
) g_free (cmd
->data
.dir
);
1029 case SET_ENVIRONMENT_COMMAND
:
1030 g_strfreev (cmd
->data
.env
);
1032 case ATTACH_COMMAND
:
1033 g_list_foreach (cmd
->data
.attach
.dirs
, (GFunc
)g_free
, NULL
);
1034 g_list_free (cmd
->data
.attach
.dirs
);
1036 case RUN_TO_COMMAND
:
1037 case RUN_FROM_COMMAND
:
1038 case BREAK_LINE_COMMAND
:
1039 case BREAK_FUNCTION_COMMAND
:
1040 case BREAK_ADDRESS_COMMAND
:
1041 if (cmd
->data
.pos
.file
) g_free (cmd
->data
.pos
.file
);
1042 if (cmd
->data
.pos
.function
) g_free (cmd
->data
.pos
.function
);
1044 case CONDITION_BREAK_COMMAND
:
1045 if (cmd
->data
.brk
.condition
) g_free (cmd
->data
.brk
.condition
);
1048 if (cmd
->data
.user
.cmd
) g_free (cmd
->data
.user
.cmd
);
1051 if (cmd
->data
.print
.var
) g_free (cmd
->data
.print
.var
);
1053 case HANDLE_SIGNAL_COMMAND
:
1054 if (cmd
->data
.signal
.name
) g_free (cmd
->data
.signal
.name
);
1056 case DELETE_VARIABLE
:
1057 case ASSIGN_VARIABLE
:
1058 case CREATE_VARIABLE
:
1059 case EVALUATE_VARIABLE
:
1060 case LIST_VARIABLE_CHILDREN
:
1061 case UPDATE_VARIABLE
:
1062 if (cmd
->data
.var
.name
) g_free (cmd
->data
.var
.name
);
1071 dma_command_cancel (DmaQueueCommand
*cmd
)
1073 GError
*err
= g_error_new_literal (IANJUTA_DEBUGGER_ERROR
, IANJUTA_DEBUGGER_CANCEL
, "Command cancel");
1075 if (cmd
->callback
!= NULL
)
1077 cmd
->callback (NULL
, cmd
->user_data
, err
);
1082 g_warning ("Cancel command %x\n", cmd
->type
);
1084 dma_command_free (cmd
);
1087 /* It is possible that the queue contains several add breakpoint command
1088 * for the same one. Just before sending the command to the debugger check
1089 * that the breakpoint is still not set */
1092 dma_command_is_breakpoint_pending (DmaQueueCommand
*cmd
)
1096 if (*cmd
->data
.pos
.id
== 0) return TRUE
; /* Breakpoint is not set, can add it */
1098 err
= g_error_new (IANJUTA_DEBUGGER_ERROR
, IANJUTA_DEBUGGER_ALREADY_DONE
, "Breakpoint is already set with id %d", *cmd
->data
.pos
.id
);
1100 if (cmd
->callback
!= NULL
)
1102 cmd
->callback (NULL
, cmd
->user_data
, err
);
1110 dma_command_run (DmaQueueCommand
*cmd
, IAnjutaDebugger
*debugger
,
1111 DmaDebuggerQueue
*queue
, GError
**err
)
1113 IAnjutaDebuggerRegisterData reg
;
1114 gboolean ret
= FALSE
;
1115 DmaDebuggerCommandType type
= cmd
->type
& COMMAND_MASK
;
1116 IAnjutaDebuggerCallback callback
= cmd
->callback
== NULL
? NULL
: dma_debugger_queue_command_callback
;
1122 case CALLBACK_COMMAND
:
1123 ret
= ianjuta_debugger_callback (debugger
, callback
, queue
, err
);
1126 ret
= ianjuta_debugger_load (debugger
, cmd
->data
.load
.file
, cmd
->data
.load
.type
, cmd
->data
.load
.dirs
, err
);
1128 case ATTACH_COMMAND
:
1129 ret
= ianjuta_debugger_attach (debugger
, cmd
->data
.attach
.pid
, cmd
->data
.load
.dirs
, err
);
1131 case SET_WORKING_DIRECTORY_COMMAND
:
1132 ret
= ianjuta_debugger_set_working_directory (debugger
, cmd
->data
.dir
, err
);
1134 case SET_ENVIRONMENT_COMMAND
:
1135 ret
= ianjuta_debugger_set_environment (debugger
, cmd
->data
.env
, err
);
1137 case UNLOAD_COMMAND
:
1138 ret
= ianjuta_debugger_unload (debugger
, err
);
1141 ret
= ianjuta_debugger_quit (debugger
, err
);
1144 ret
= ianjuta_debugger_abort (debugger
, err
);
1147 ret
= ianjuta_debugger_start (debugger
, cmd
->data
.start
.args
, cmd
->data
.start
.terminal
, cmd
->data
.start
.stop
, err
);
1149 case CONNECT_COMMAND
:
1150 ret
= ianjuta_debugger_connect (debugger
, cmd
->data
.start
.server
, cmd
->data
.start
.args
, cmd
->data
.start
.terminal
, cmd
->data
.start
.stop
, err
);
1153 ret
= ianjuta_debugger_run (debugger
, err
);
1155 case RUN_TO_COMMAND
:
1156 ret
= ianjuta_debugger_run_to (debugger
, cmd
->data
.pos
.file
, cmd
->data
.pos
.line
, err
);
1158 case RUN_FROM_COMMAND
:
1159 ret
= ianjuta_debugger_run_from (debugger
, cmd
->data
.pos
.file
, cmd
->data
.pos
.line
, err
);
1161 case STEP_IN_COMMAND
:
1162 ret
= ianjuta_debugger_step_in (debugger
, err
);
1164 case STEP_OVER_COMMAND
:
1165 ret
= ianjuta_debugger_step_over (debugger
, err
);
1167 case STEP_OUT_COMMAND
:
1168 ret
= ianjuta_debugger_step_out (debugger
, err
);
1170 case RUN_TO_ADDRESS_COMMAND
:
1171 ret
= ianjuta_debugger_instruction_run_to_address (IANJUTA_DEBUGGER_INSTRUCTION (debugger
), cmd
->data
.pos
.address
, err
);
1173 case RUN_FROM_ADDRESS_COMMAND
:
1174 ret
= ianjuta_debugger_instruction_run_from_address (IANJUTA_DEBUGGER_INSTRUCTION (debugger
), cmd
->data
.pos
.address
, err
);
1176 case STEPI_IN_COMMAND
:
1177 ret
= ianjuta_debugger_instruction_step_in_instruction (IANJUTA_DEBUGGER_INSTRUCTION (debugger
), err
);
1179 case STEPI_OVER_COMMAND
:
1180 ret
= ianjuta_debugger_instruction_step_over_instruction (IANJUTA_DEBUGGER_INSTRUCTION (debugger
), err
);
1183 ret
= ianjuta_debugger_exit (debugger
, err
);
1185 case INTERRUPT_COMMAND
:
1186 ret
= ianjuta_debugger_interrupt (debugger
, err
);
1188 case ENABLE_BREAK_COMMAND
:
1189 ret
= ianjuta_debugger_breakpoint_enable_breakpoint (IANJUTA_DEBUGGER_BREAKPOINT (debugger
), cmd
->data
.brk
.id
, cmd
->data
.brk
.enable
, (IAnjutaDebuggerBreakpointCallback
)callback
, queue
, err
);
1191 case IGNORE_BREAK_COMMAND
:
1192 ret
= ianjuta_debugger_breakpoint_ignore_breakpoint (IANJUTA_DEBUGGER_BREAKPOINT (debugger
), cmd
->data
.brk
.id
, cmd
->data
.brk
.ignore
, (IAnjutaDebuggerBreakpointCallback
)callback
, queue
, err
);
1194 case REMOVE_BREAK_COMMAND
:
1195 ret
= ianjuta_debugger_breakpoint_clear_breakpoint (IANJUTA_DEBUGGER_BREAKPOINT (debugger
), cmd
->data
.brk
.id
, (IAnjutaDebuggerBreakpointCallback
)callback
, queue
, err
);
1197 case BREAK_LINE_COMMAND
:
1198 if (dma_command_is_breakpoint_pending (cmd
))
1200 ret
= ianjuta_debugger_breakpoint_set_breakpoint_at_line (IANJUTA_DEBUGGER_BREAKPOINT (debugger
), cmd
->data
.pos
.file
, cmd
->data
.pos
.line
, (IAnjutaDebuggerBreakpointCallback
)callback
, queue
, err
);
1207 case BREAK_FUNCTION_COMMAND
:
1208 if (dma_command_is_breakpoint_pending (cmd
))
1210 ret
= ianjuta_debugger_breakpoint_set_breakpoint_at_function (IANJUTA_DEBUGGER_BREAKPOINT (debugger
), cmd
->data
.pos
.file
, cmd
->data
.pos
.function
, (IAnjutaDebuggerBreakpointCallback
)callback
, queue
, err
);
1217 case BREAK_ADDRESS_COMMAND
:
1218 if (dma_command_is_breakpoint_pending (cmd
))
1220 ret
= ianjuta_debugger_breakpoint_set_breakpoint_at_address (IANJUTA_DEBUGGER_BREAKPOINT (debugger
), cmd
->data
.pos
.address
, (IAnjutaDebuggerBreakpointCallback
)callback
, queue
, err
);
1227 case CONDITION_BREAK_COMMAND
:
1228 ret
= ianjuta_debugger_breakpoint_condition_breakpoint (IANJUTA_DEBUGGER_BREAKPOINT (debugger
), cmd
->data
.brk
.id
, cmd
->data
.brk
.condition
, (IAnjutaDebuggerBreakpointCallback
)callback
, queue
, err
);
1230 case LIST_BREAK_COMMAND
:
1231 ret
= ianjuta_debugger_breakpoint_list_breakpoint (IANJUTA_DEBUGGER_BREAKPOINT (debugger
), (IAnjutaDebuggerGListCallback
)callback
, queue
, err
);
1233 case INSPECT_COMMAND
:
1234 ret
= ianjuta_debugger_inspect (debugger
, cmd
->data
.watch
.name
, (IAnjutaDebuggerGCharCallback
)callback
, queue
, err
);
1236 case EVALUATE_COMMAND
:
1237 ret
= ianjuta_debugger_evaluate (debugger
, cmd
->data
.watch
.name
, cmd
->data
.watch
.value
, (IAnjutaDebuggerGCharCallback
)callback
, queue
, err
);
1239 case LIST_LOCAL_COMMAND
:
1240 ret
= ianjuta_debugger_list_local (debugger
, (IAnjutaDebuggerGListCallback
)callback
, queue
, err
);
1242 case LIST_ARG_COMMAND
:
1243 ret
= ianjuta_debugger_list_argument (debugger
, (IAnjutaDebuggerGListCallback
)callback
, queue
, err
);
1245 case LIST_THREAD_COMMAND
:
1246 ret
= ianjuta_debugger_list_thread (debugger
, (IAnjutaDebuggerGListCallback
)callback
, queue
, err
);
1248 case SET_THREAD_COMMAND
:
1249 ret
= ianjuta_debugger_set_thread (debugger
, cmd
->data
.frame
.frame
, err
);
1251 case INFO_THREAD_COMMAND
:
1252 ret
= ianjuta_debugger_info_thread (debugger
, cmd
->data
.info
.id
, (IAnjutaDebuggerGListCallback
)callback
, queue
, err
);
1254 case INFO_SIGNAL_COMMAND
:
1255 ret
= ianjuta_debugger_info_signal (debugger
, (IAnjutaDebuggerGListCallback
)callback
, queue
, err
);
1257 case INFO_SHAREDLIB_COMMAND
:
1258 ret
= ianjuta_debugger_info_sharedlib (debugger
, (IAnjutaDebuggerGListCallback
)callback
, queue
, err
);
1260 case SET_FRAME_COMMAND
:
1261 ret
= ianjuta_debugger_set_frame (debugger
, cmd
->data
.frame
.frame
, err
);
1263 case LIST_FRAME_COMMAND
:
1264 ret
= ianjuta_debugger_list_frame (debugger
, (IAnjutaDebuggerGListCallback
)callback
, queue
, err
);
1266 case DUMP_STACK_TRACE_COMMAND
:
1267 ret
= ianjuta_debugger_dump_stack_trace (debugger
, (IAnjutaDebuggerGListCallback
)callback
, queue
, err
);
1269 case LIST_REGISTER_COMMAND
:
1270 ret
= ianjuta_debugger_register_list_register (IANJUTA_DEBUGGER_REGISTER (debugger
), (IAnjutaDebuggerGListCallback
)callback
, queue
, err
);
1272 case UPDATE_REGISTER_COMMAND
:
1273 ret
= ianjuta_debugger_register_update_register (IANJUTA_DEBUGGER_REGISTER (debugger
), (IAnjutaDebuggerGListCallback
)callback
, queue
, err
);
1275 case WRITE_REGISTER_COMMAND
:
1276 reg
.num
= cmd
->data
.watch
.id
;
1277 reg
.name
= cmd
->data
.watch
.name
;
1278 reg
.value
= cmd
->data
.watch
.value
;
1279 ret
= ianjuta_debugger_register_write_register (IANJUTA_DEBUGGER_REGISTER (debugger
), ®
, err
);
1281 case INSPECT_MEMORY_COMMAND
:
1282 ret
= ianjuta_debugger_memory_inspect (IANJUTA_DEBUGGER_MEMORY (debugger
), cmd
->data
.mem
.address
, cmd
->data
.mem
.length
, (IAnjutaDebuggerMemoryCallback
)callback
, queue
, err
);
1284 case DISASSEMBLE_COMMAND
:
1285 ret
= ianjuta_debugger_instruction_disassemble (IANJUTA_DEBUGGER_INSTRUCTION (debugger
), cmd
->data
.mem
.address
, cmd
->data
.mem
.length
, (IAnjutaDebuggerInstructionCallback
)callback
, queue
, err
);
1288 ret
= ianjuta_debugger_send_command (debugger
, cmd
->data
.user
.cmd
, err
);
1291 ret
= ianjuta_debugger_print (debugger
, cmd
->data
.print
.var
, (IAnjutaDebuggerGCharCallback
)callback
, queue
, err
);
1293 case HANDLE_SIGNAL_COMMAND
:
1294 ret
= ianjuta_debugger_handle_signal (debugger
, cmd
->data
.signal
.name
, cmd
->data
.signal
.stop
, cmd
->data
.signal
.print
, cmd
->data
.signal
.ignore
, err
);
1296 case DELETE_VARIABLE
:
1297 ret
= ianjuta_debugger_variable_destroy (IANJUTA_DEBUGGER_VARIABLE (debugger
), cmd
->data
.var
.name
, NULL
);
1299 case ASSIGN_VARIABLE
:
1300 ret
= ianjuta_debugger_variable_assign (IANJUTA_DEBUGGER_VARIABLE (debugger
), cmd
->data
.var
.name
, cmd
->data
.var
.value
, err
);
1302 case EVALUATE_VARIABLE
:
1303 ret
= ianjuta_debugger_variable_evaluate (IANJUTA_DEBUGGER_VARIABLE (debugger
), cmd
->data
.var
.name
, (IAnjutaDebuggerGCharCallback
)callback
, queue
, err
);
1305 case LIST_VARIABLE_CHILDREN
:
1306 ret
= ianjuta_debugger_variable_list_children (IANJUTA_DEBUGGER_VARIABLE (debugger
), cmd
->data
.var
.name
, cmd
->data
.var
.from
, (IAnjutaDebuggerGListCallback
)callback
, queue
, err
);
1308 case CREATE_VARIABLE
:
1309 ret
= ianjuta_debugger_variable_create (IANJUTA_DEBUGGER_VARIABLE (debugger
), cmd
->data
.var
.name
, (IAnjutaDebuggerVariableCallback
)callback
, queue
, err
);
1311 case UPDATE_VARIABLE
:
1312 ret
= ianjuta_debugger_variable_update (IANJUTA_DEBUGGER_VARIABLE (debugger
), (IAnjutaDebuggerGListCallback
)callback
, queue
, err
);
1320 dma_command_callback (DmaQueueCommand
*cmd
, const gpointer data
, GError
*err
)
1322 DmaDebuggerCommandType type
= cmd
->type
& COMMAND_MASK
;
1328 case ATTACH_COMMAND
:
1329 case UNLOAD_COMMAND
:
1333 case CONNECT_COMMAND
:
1334 case SET_WORKING_DIRECTORY_COMMAND
:
1335 case SET_ENVIRONMENT_COMMAND
:
1337 case RUN_TO_COMMAND
:
1338 case RUN_FROM_COMMAND
:
1339 case STEP_IN_COMMAND
:
1340 case STEP_OVER_COMMAND
:
1341 case STEP_OUT_COMMAND
:
1342 case RUN_TO_ADDRESS_COMMAND
:
1343 case RUN_FROM_ADDRESS_COMMAND
:
1344 case STEPI_IN_COMMAND
:
1345 case STEPI_OVER_COMMAND
:
1347 case INTERRUPT_COMMAND
:
1348 case SET_THREAD_COMMAND
:
1349 case SET_FRAME_COMMAND
:
1350 case WRITE_REGISTER_COMMAND
:
1352 case HANDLE_SIGNAL_COMMAND
:
1353 case DELETE_VARIABLE
:
1354 case ASSIGN_VARIABLE
:
1355 g_return_if_reached ();
1357 case CALLBACK_COMMAND
:
1358 case ENABLE_BREAK_COMMAND
:
1359 case IGNORE_BREAK_COMMAND
:
1360 case REMOVE_BREAK_COMMAND
:
1361 case BREAK_LINE_COMMAND
:
1362 case BREAK_FUNCTION_COMMAND
:
1363 case BREAK_ADDRESS_COMMAND
:
1364 case CONDITION_BREAK_COMMAND
:
1365 case LIST_BREAK_COMMAND
:
1366 case INSPECT_COMMAND
:
1367 case EVALUATE_COMMAND
:
1368 case LIST_LOCAL_COMMAND
:
1369 case LIST_ARG_COMMAND
:
1370 case LIST_THREAD_COMMAND
:
1371 case INFO_THREAD_COMMAND
:
1372 case INFO_SIGNAL_COMMAND
:
1373 case INFO_SHAREDLIB_COMMAND
:
1374 case LIST_FRAME_COMMAND
:
1375 case DUMP_STACK_TRACE_COMMAND
:
1376 case LIST_REGISTER_COMMAND
:
1377 case UPDATE_REGISTER_COMMAND
:
1378 case INSPECT_MEMORY_COMMAND
:
1379 case DISASSEMBLE_COMMAND
:
1381 case EVALUATE_VARIABLE
:
1382 case LIST_VARIABLE_CHILDREN
:
1383 case CREATE_VARIABLE
:
1384 case UPDATE_VARIABLE
:
1385 if (cmd
->callback
!= NULL
)
1387 cmd
->callback (data
, cmd
->user_data
, err
);
1394 dma_command_is_valid_in_state (DmaQueueCommand
*cmd
, IAnjutaDebuggerState state
)
1396 return cmd
->type
& 1 << (state
+ STATE_TO_NEED
- 1);
1399 IAnjutaDebuggerState
1400 dma_command_is_going_to_state (DmaQueueCommand
*cmd
)
1402 IAnjutaDebuggerState state
;
1404 switch (cmd
->type
& CHANGE_MASK
)
1407 state
= IANJUTA_DEBUGGER_STOPPED
;
1409 case START_DEBUGGER
:
1410 state
= IANJUTA_DEBUGGER_STARTED
;
1413 state
= IANJUTA_DEBUGGER_PROGRAM_LOADED
;
1416 state
= IANJUTA_DEBUGGER_PROGRAM_STOPPED
;
1419 state
= IANJUTA_DEBUGGER_PROGRAM_RUNNING
;
1422 state
= IANJUTA_DEBUGGER_BUSY
;
1429 dma_command_has_flag (DmaQueueCommand
*cmd
, DmaCommandFlag flag
)
1431 return cmd
->type
& flag
;
1435 dma_command_get_type (DmaQueueCommand
*cmd
)
1437 return (int)cmd
->type
;