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 */
65 BREAK_LINE_COMMAND
, /* Program loaded - Program stopped */
66 BREAK_FUNCTION_COMMAND
,
67 BREAK_ADDRESS_COMMAND
, /* 0x10 */
70 CONDITION_BREAK_COMMAND
,
73 INFO_SHAREDLIB_COMMAND
,
77 STEP_IN_COMMAND
, /* Program stopped */
83 STEPI_OVER_COMMAND
, /* 0x20 */
84 RUN_TO_ADDRESS_COMMAND
,
86 HANDLE_SIGNAL_COMMAND
,
95 INFO_VARIABLES_COMMAND
,
98 UPDATE_REGISTER_COMMAND
,
99 WRITE_REGISTER_COMMAND
, /* 0x30 */
105 LIST_VARIABLE_CHILDREN
,
109 INTERRUPT_COMMAND
/* Program running */
110 } DmaDebuggerCommandType
;
114 DMA_CALLBACK_COMMAND
=
116 NEED_DEBUGGER_STOPPED
| NEED_DEBUGGER_STARTED
| NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
118 LOAD_COMMAND
| LOAD_PROGRAM
|
119 NEED_DEBUGGER_STOPPED
| NEED_DEBUGGER_STARTED
,
121 ATTACH_COMMAND
| RUN_PROGRAM
|
122 NEED_DEBUGGER_STOPPED
| NEED_DEBUGGER_STARTED
,
124 QUIT_COMMAND
| CANCEL_ALL_COMMAND
| STOP_DEBUGGER
|
125 HIGH_PRIORITY
| NEED_DEBUGGER_STARTED
| NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
127 ABORT_COMMAND
| CANCEL_ALL_COMMAND
| STOP_DEBUGGER
|
128 ASYNCHRONOUS
| NEED_DEBUGGER_STARTED
| NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
131 NEED_DEBUGGER_STARTED
| NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
132 DMA_INSPECT_MEMORY_COMMAND
=
133 INSPECT_MEMORY_COMMAND
|
134 NEED_DEBUGGER_STARTED
| NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
135 DMA_DISASSEMBLE_COMMAND
=
136 DISASSEMBLE_COMMAND
|
137 NEED_DEBUGGER_STARTED
| NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
138 DMA_LIST_REGISTER_COMMAND
=
139 LIST_REGISTER_COMMAND
|
140 NEED_DEBUGGER_STARTED
| NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
141 DMA_SET_WORKING_DIRECTORY_COMMAND
=
142 SET_WORKING_DIRECTORY_COMMAND
|
143 NEED_DEBUGGER_STARTED
| NEED_PROGRAM_LOADED
,
144 DMA_SET_ENVIRONMENT_COMMAND
=
145 SET_ENVIRONMENT_COMMAND
|
146 NEED_DEBUGGER_STARTED
| NEED_PROGRAM_LOADED
,
148 UNLOAD_COMMAND
| START_DEBUGGER
|
149 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
151 START_COMMAND
| RUN_PROGRAM
|
152 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
153 DMA_BREAK_LINE_COMMAND
=
155 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
156 DMA_BREAK_FUNCTION_COMMAND
=
157 BREAK_FUNCTION_COMMAND
|
158 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
159 DMA_BREAK_ADDRESS_COMMAND
=
160 BREAK_ADDRESS_COMMAND
|
161 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
162 DMA_ENABLE_BREAK_COMMAND
=
163 ENABLE_BREAK_COMMAND
|
164 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
165 DMA_IGNORE_BREAK_COMMAND
=
166 IGNORE_BREAK_COMMAND
|
167 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
168 DMA_CONDITION_BREAK_COMMAND
=
169 CONDITION_BREAK_COMMAND
|
170 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
171 DMA_REMOVE_BREAK_COMMAND
=
172 REMOVE_BREAK_COMMAND
|
173 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
174 DMA_LIST_BREAK_COMMAND
=
176 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
177 DMA_INFO_SHAREDLIB_COMMAND
=
178 INFO_SHAREDLIB_COMMAND
|
179 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
180 DMA_INFO_TARGET_COMMAND
=
181 INFO_TARGET_COMMAND
|
182 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
183 DMA_INFO_PROGRAM_COMMAND
=
184 INFO_PROGRAM_COMMAND
|
185 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
186 DMA_INFO_UDOT_COMMAND
=
188 NEED_PROGRAM_LOADED
| NEED_PROGRAM_STOPPED
,
189 DMA_STEP_IN_COMMAND
=
190 STEP_IN_COMMAND
| RUN_PROGRAM
|
191 NEED_PROGRAM_STOPPED
,
192 DMA_STEP_OVER_COMMAND
=
193 STEP_OVER_COMMAND
| RUN_PROGRAM
|
194 NEED_PROGRAM_STOPPED
,
195 DMA_STEP_OUT_COMMAND
=
196 STEP_OUT_COMMAND
| RUN_PROGRAM
|
197 NEED_PROGRAM_STOPPED
,
199 RUN_COMMAND
| RUN_PROGRAM
|
200 NEED_PROGRAM_STOPPED
,
202 RUN_TO_COMMAND
| RUN_PROGRAM
|
203 NEED_PROGRAM_STOPPED
,
204 DMA_STEPI_IN_COMMAND
=
205 STEPI_IN_COMMAND
| RUN_PROGRAM
|
206 NEED_PROGRAM_STOPPED
,
207 DMA_STEPI_OVER_COMMAND
=
208 STEPI_OVER_COMMAND
| RUN_PROGRAM
|
209 NEED_PROGRAM_STOPPED
,
210 DMA_RUN_TO_ADDRESS_COMMAND
=
211 RUN_TO_ADDRESS_COMMAND
| RUN_PROGRAM
|
212 NEED_PROGRAM_STOPPED
,
214 EXIT_COMMAND
| LOAD_PROGRAM
|
215 NEED_PROGRAM_STOPPED
,
216 DMA_HANDLE_SIGNAL_COMMAND
=
217 HANDLE_SIGNAL_COMMAND
|
218 NEED_PROGRAM_STOPPED
,
219 DMA_LIST_LOCAL_COMMAND
=
221 NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
222 DMA_LIST_ARG_COMMAND
=
224 NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
225 DMA_LIST_THREAD_COMMAND
=
226 LIST_THREAD_COMMAND
|
227 NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
228 DMA_SET_THREAD_COMMAND
=
230 NEED_PROGRAM_STOPPED
,
231 DMA_INFO_THREAD_COMMAND
=
232 INFO_THREAD_COMMAND
|
233 NEED_PROGRAM_STOPPED
,
234 DMA_INFO_SIGNAL_COMMAND
=
235 INFO_SIGNAL_COMMAND
|
236 NEED_PROGRAM_STOPPED
,
237 DMA_INFO_FRAME_COMMAND
=
239 NEED_PROGRAM_STOPPED
,
240 DMA_INFO_ARGS_COMMAND
=
242 NEED_PROGRAM_STOPPED
,
243 DMA_INFO_VARIABLES_COMMAND
=
244 INFO_VARIABLES_COMMAND
|
245 NEED_PROGRAM_STOPPED
,
246 DMA_SET_FRAME_COMMAND
=
248 NEED_PROGRAM_STOPPED
,
249 DMA_LIST_FRAME_COMMAND
=
251 NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
252 DMA_UPDATE_REGISTER_COMMAND
=
253 UPDATE_REGISTER_COMMAND
|
254 NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
255 DMA_WRITE_REGISTER_COMMAND
=
256 WRITE_REGISTER_COMMAND
|
257 NEED_PROGRAM_STOPPED
,
258 DMA_EVALUATE_COMMAND
=
260 NEED_PROGRAM_STOPPED
,
261 DMA_INSPECT_COMMAND
=
263 NEED_PROGRAM_STOPPED
,
266 NEED_PROGRAM_STOPPED
,
267 DMA_CREATE_VARIABLE_COMMAND
=
269 NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
270 DMA_EVALUATE_VARIABLE_COMMAND
=
271 EVALUATE_VARIABLE
| CANCEL_IF_PROGRAM_RUNNING
|
272 NEED_PROGRAM_STOPPED
,
273 DMA_LIST_VARIABLE_CHILDREN_COMMAND
=
274 LIST_VARIABLE_CHILDREN
|
275 NEED_PROGRAM_STOPPED
,
276 DMA_DELETE_VARIABLE_COMMAND
=
278 NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
279 DMA_ASSIGN_VARIABLE_COMMAND
=
281 NEED_PROGRAM_STOPPED
,
282 DMA_UPDATE_VARIABLE_COMMAND
=
283 UPDATE_VARIABLE
| CANCEL_IF_PROGRAM_RUNNING
|
284 NEED_PROGRAM_STOPPED
| NEED_PROGRAM_RUNNING
,
285 DMA_INTERRUPT_COMMAND
=
286 INTERRUPT_COMMAND
| STOP_PROGRAM
|
287 ASYNCHRONOUS
| NEED_PROGRAM_RUNNING
,
288 } DmaDebuggerCommand
;
290 struct _DmaQueueCommand
292 DmaDebuggerCommandType type
;
293 IAnjutaDebuggerCallback callback
;
357 struct _DmaQueueCommand
*next
;
361 *---------------------------------------------------------------------------*/
363 static DmaQueueCommand
*
364 dma_command_new (DmaDebuggerCommand cmd_type
,...)
366 DmaQueueCommand
* cmd
;
367 DmaDebuggerCommandType type
= cmd_type
& COMMAND_MASK
;
368 IAnjutaDebuggerRegisterData
* reg
;
372 cmd
= g_new0 (DmaQueueCommand
, 1);
373 cmd
->type
= cmd_type
;
375 va_start (args
, cmd_type
);
380 case CALLBACK_COMMAND
:
381 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
382 cmd
->user_data
= va_arg (args
, gpointer
);
385 cmd
->data
.load
.file
= g_strdup (va_arg (args
, gchar
*));
386 cmd
->data
.load
.type
= g_strdup (va_arg (args
, gchar
*));
387 cmd
->data
.load
.dirs
= NULL
;
388 for (list
= va_arg (args
, GList
*); list
!= NULL
; list
= g_list_next (list
))
390 cmd
->data
.load
.dirs
= g_list_prepend (cmd
->data
.load
.dirs
, g_strdup (list
->data
));
392 cmd
->data
.load
.dirs
= g_list_reverse (cmd
->data
.load
.dirs
);
395 cmd
->data
.attach
.pid
= va_arg (args
,pid_t
);
396 cmd
->data
.load
.dirs
= NULL
;
397 for (list
= va_arg (args
, GList
*); list
!= NULL
; list
= g_list_next (list
))
399 cmd
->data
.load
.dirs
= g_list_prepend (cmd
->data
.load
.dirs
, g_strdup (list
->data
));
401 cmd
->data
.load
.dirs
= g_list_reverse (cmd
->data
.load
.dirs
);
409 case SET_WORKING_DIRECTORY_COMMAND
:
410 cmd
->data
.dir
= g_strdup (va_arg (args
, gchar
*));
412 case SET_ENVIRONMENT_COMMAND
:
413 cmd
->data
.env
= g_strdupv (va_arg (args
, gchar
**));
416 cmd
->data
.start
.args
= g_strdup (va_arg (args
, gchar
*));
417 cmd
->data
.start
.terminal
= va_arg (args
, gboolean
);
418 cmd
->data
.start
.stop
= va_arg (args
, gboolean
);
423 cmd
->data
.pos
.file
= g_strdup (va_arg (args
, gchar
*));
424 cmd
->data
.pos
.line
= va_arg (args
, guint
);
426 case STEP_IN_COMMAND
:
428 case STEP_OVER_COMMAND
:
430 case STEP_OUT_COMMAND
:
432 case RUN_TO_ADDRESS_COMMAND
:
433 cmd
->data
.pos
.address
= va_arg (args
, guint
);
435 case STEPI_IN_COMMAND
:
437 case STEPI_OVER_COMMAND
:
441 case INTERRUPT_COMMAND
:
443 case ENABLE_BREAK_COMMAND
:
444 cmd
->data
.brk
.id
= va_arg (args
, gint
);
445 cmd
->data
.brk
.enable
= va_arg (args
, gboolean
);
446 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
447 cmd
->user_data
= va_arg (args
, gpointer
);
449 case IGNORE_BREAK_COMMAND
:
450 cmd
->data
.brk
.id
= va_arg (args
, gint
);
451 cmd
->data
.brk
.ignore
= va_arg (args
, guint
);
452 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
453 cmd
->user_data
= va_arg (args
, gpointer
);
455 case REMOVE_BREAK_COMMAND
:
456 cmd
->data
.brk
.id
= va_arg (args
, gint
);
457 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
458 cmd
->user_data
= va_arg (args
, gpointer
);
460 case BREAK_LINE_COMMAND
:
461 cmd
->data
.pos
.id
= va_arg (args
, guint
*);
462 cmd
->data
.pos
.file
= g_strdup (va_arg (args
, gchar
*));
463 cmd
->data
.pos
.line
= va_arg (args
, guint
);
464 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
465 cmd
->user_data
= va_arg (args
, gpointer
);
467 case BREAK_FUNCTION_COMMAND
:
468 cmd
->data
.pos
.id
= va_arg (args
, guint
*);
469 cmd
->data
.pos
.file
= g_strdup (va_arg (args
, gchar
*));
470 cmd
->data
.pos
.function
= g_strdup (va_arg (args
, gchar
*));
471 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
472 cmd
->user_data
= va_arg (args
, gpointer
);
474 case BREAK_ADDRESS_COMMAND
:
475 cmd
->data
.pos
.id
= va_arg (args
, guint
*);
476 cmd
->data
.pos
.address
= va_arg (args
, gulong
);
477 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
478 cmd
->user_data
= va_arg (args
, gpointer
);
480 case CONDITION_BREAK_COMMAND
:
481 cmd
->data
.brk
.id
= va_arg (args
, gint
);
482 cmd
->data
.brk
.condition
= g_strdup (va_arg (args
, gchar
*));
483 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
484 cmd
->user_data
= va_arg (args
, gpointer
);
486 case LIST_BREAK_COMMAND
:
487 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
488 cmd
->user_data
= va_arg (args
, gpointer
);
490 case INSPECT_COMMAND
:
491 cmd
->data
.watch
.name
= g_strdup (va_arg (args
, gchar
*));
492 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
493 cmd
->user_data
= va_arg (args
, gpointer
);
495 case EVALUATE_COMMAND
:
496 cmd
->data
.watch
.name
= g_strdup (va_arg (args
, gchar
*));
497 cmd
->data
.watch
.value
= g_strdup (va_arg (args
, gchar
*));
498 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
499 cmd
->user_data
= va_arg (args
, gpointer
);
501 case LIST_LOCAL_COMMAND
:
502 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
503 cmd
->user_data
= va_arg (args
, gpointer
);
505 case LIST_ARG_COMMAND
:
506 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
507 cmd
->user_data
= va_arg (args
, gpointer
);
509 case LIST_THREAD_COMMAND
:
510 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
511 cmd
->user_data
= va_arg (args
, gpointer
);
513 case SET_THREAD_COMMAND
:
514 cmd
->data
.frame
.frame
= va_arg (args
, guint
);
516 case INFO_THREAD_COMMAND
:
517 cmd
->data
.info
.id
= va_arg (args
, guint
);
518 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
519 cmd
->user_data
= va_arg (args
, gpointer
);
521 case INFO_SIGNAL_COMMAND
:
522 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
523 cmd
->user_data
= va_arg (args
, gpointer
);
525 case INFO_SHAREDLIB_COMMAND
:
526 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
527 cmd
->user_data
= va_arg (args
, gpointer
);
529 case INFO_FRAME_COMMAND
:
530 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
531 cmd
->user_data
= va_arg (args
, gpointer
);
533 case INFO_ARGS_COMMAND
:
534 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
535 cmd
->user_data
= va_arg (args
, gpointer
);
537 case INFO_TARGET_COMMAND
:
538 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
539 cmd
->user_data
= va_arg (args
, gpointer
);
541 case INFO_PROGRAM_COMMAND
:
542 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
543 cmd
->user_data
= va_arg (args
, gpointer
);
545 case INFO_UDOT_COMMAND
:
546 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
547 cmd
->user_data
= va_arg (args
, gpointer
);
549 case INFO_VARIABLES_COMMAND
:
550 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
551 cmd
->user_data
= va_arg (args
, gpointer
);
553 case SET_FRAME_COMMAND
:
554 cmd
->data
.frame
.frame
= va_arg (args
, guint
);
556 case LIST_FRAME_COMMAND
:
557 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
558 cmd
->user_data
= va_arg (args
, gpointer
);
560 case LIST_REGISTER_COMMAND
:
561 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
562 cmd
->user_data
= va_arg (args
, gpointer
);
564 case UPDATE_REGISTER_COMMAND
:
565 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
566 cmd
->user_data
= va_arg (args
, gpointer
);
568 case WRITE_REGISTER_COMMAND
:
569 reg
= va_arg (args
, IAnjutaDebuggerRegisterData
*);
570 cmd
->data
.watch
.id
= reg
->num
;
571 cmd
->data
.watch
.name
= g_strdup (reg
->name
);
572 cmd
->data
.watch
.value
= g_strdup (reg
->value
);
574 case INSPECT_MEMORY_COMMAND
:
575 cmd
->data
.mem
.address
= va_arg (args
, gulong
);
576 cmd
->data
.mem
.length
= va_arg (args
, guint
);
577 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
578 cmd
->user_data
= va_arg (args
, gpointer
);
580 case DISASSEMBLE_COMMAND
:
581 cmd
->data
.mem
.address
= va_arg (args
, gulong
);
582 cmd
->data
.mem
.length
= va_arg (args
, guint
);
583 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
584 cmd
->user_data
= va_arg (args
, gpointer
);
587 cmd
->data
.user
.cmd
= g_strdup (va_arg (args
, gchar
*));
590 cmd
->data
.print
.var
= g_strdup (va_arg (args
, gchar
*));
591 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
592 cmd
->user_data
= va_arg (args
, gpointer
);
594 case HANDLE_SIGNAL_COMMAND
:
595 cmd
->data
.signal
.name
= g_strdup (va_arg (args
, gchar
*));
596 cmd
->data
.signal
.stop
= va_arg (args
, gboolean
);
597 cmd
->data
.signal
.print
= va_arg (args
, gboolean
);
598 cmd
->data
.signal
.ignore
= va_arg (args
, gboolean
);
600 case DELETE_VARIABLE
:
601 cmd
->data
.var
.name
= g_strdup (va_arg (args
, gchar
*));
603 case ASSIGN_VARIABLE
:
604 cmd
->data
.var
.name
= g_strdup (va_arg (args
, gchar
*));
605 cmd
->data
.var
.value
= g_strdup (va_arg (args
, gchar
*));
607 case EVALUATE_VARIABLE
:
608 cmd
->data
.var
.name
= g_strdup (va_arg (args
, gchar
*));
609 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
610 cmd
->user_data
= va_arg (args
, gpointer
);
612 case LIST_VARIABLE_CHILDREN
:
613 cmd
->data
.var
.name
= g_strdup (va_arg (args
, gchar
*));
614 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
615 cmd
->user_data
= va_arg (args
, gpointer
);
617 case CREATE_VARIABLE
:
618 cmd
->data
.var
.name
= g_strdup (va_arg (args
, gchar
*));
619 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
620 cmd
->user_data
= va_arg (args
, gpointer
);
622 case UPDATE_VARIABLE
:
623 cmd
->callback
= va_arg (args
, IAnjutaDebuggerCallback
);
624 cmd
->user_data
= va_arg (args
, gpointer
);
632 *---------------------------------------------------------------------------*/
635 dma_queue_load (DmaDebuggerQueue
*self
, const gchar
*file
, const gchar
* mime_type
, const GList
*search_dirs
)
637 if (!dma_debugger_queue_start (self
, mime_type
)) return FALSE
;
639 return dma_debugger_queue_append (self
, dma_command_new (DMA_LOAD_COMMAND
, file
, mime_type
, search_dirs
));
643 dma_queue_attach (DmaDebuggerQueue
*self
, pid_t pid
, const GList
*search_dirs
)
645 if (!dma_debugger_queue_start (self
, NULL
)) return FALSE
;
647 return dma_debugger_queue_append (self
, dma_command_new (DMA_ATTACH_COMMAND
, pid
, search_dirs
));
651 dma_queue_set_working_directory(DmaDebuggerQueue
*self
, const gchar
*directory
)
653 return dma_debugger_queue_append (self
, dma_command_new (DMA_SET_WORKING_DIRECTORY_COMMAND
, directory
));
657 dma_queue_set_environment(DmaDebuggerQueue
*self
, gchar
**variables
)
659 return dma_debugger_queue_append (self
, dma_command_new (DMA_SET_ENVIRONMENT_COMMAND
, variables
));
663 dma_queue_start (DmaDebuggerQueue
*self
, const gchar
*args
, gboolean terminal
, gboolean stop
)
665 return dma_debugger_queue_append (self
, dma_command_new (DMA_START_COMMAND
, args
, terminal
, stop
));
669 dma_queue_unload (DmaDebuggerQueue
*self
)
671 return dma_debugger_queue_append (self
, dma_command_new (DMA_UNLOAD_COMMAND
));
675 dma_queue_quit (DmaDebuggerQueue
*self
)
677 return dma_debugger_queue_append (self
, dma_command_new (DMA_QUIT_COMMAND
));
681 dma_queue_abort (DmaDebuggerQueue
*self
)
683 return dma_debugger_queue_append (self
, dma_command_new (DMA_ABORT_COMMAND
));
687 dma_queue_run (DmaDebuggerQueue
*self
)
689 return dma_debugger_queue_append (self
, dma_command_new (DMA_RUN_COMMAND
));
693 dma_queue_step_in (DmaDebuggerQueue
*self
)
695 return dma_debugger_queue_append (self
, dma_command_new (DMA_STEP_IN_COMMAND
));
699 dma_queue_step_over (DmaDebuggerQueue
*self
)
701 return dma_debugger_queue_append (self
, dma_command_new (DMA_STEP_OVER_COMMAND
));
705 dma_queue_run_to (DmaDebuggerQueue
*self
, const gchar
*file
, gint line
)
707 return dma_debugger_queue_append (self
, dma_command_new (DMA_RUN_TO_COMMAND
, file
, line
));
711 dma_queue_step_out (DmaDebuggerQueue
*self
)
713 return dma_debugger_queue_append (self
, dma_command_new (DMA_STEP_OUT_COMMAND
));
717 dma_queue_stepi_in (DmaDebuggerQueue
*self
)
719 return dma_debugger_queue_append (self
, dma_command_new (DMA_STEPI_IN_COMMAND
));
723 dma_queue_stepi_over (DmaDebuggerQueue
*self
)
725 return dma_debugger_queue_append (self
, dma_command_new (DMA_STEPI_OVER_COMMAND
));
729 dma_queue_run_to_address (DmaDebuggerQueue
*self
, gulong address
)
731 return dma_debugger_queue_append (self
, dma_command_new (DMA_RUN_TO_ADDRESS_COMMAND
, address
));
735 dma_queue_exit (DmaDebuggerQueue
*self
)
737 return dma_debugger_queue_append (self
, dma_command_new (DMA_EXIT_COMMAND
));
741 dma_queue_interrupt (DmaDebuggerQueue
*self
)
743 return dma_debugger_queue_append (self
, dma_command_new (DMA_INTERRUPT_COMMAND
));
747 dma_queue_inspect (DmaDebuggerQueue
*self
, const gchar
*expression
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
749 return dma_debugger_queue_append (self
, dma_command_new (DMA_INSPECT_COMMAND
, expression
, callback
, user_data
));
753 dma_queue_evaluate (DmaDebuggerQueue
*self
, const gchar
*name
, const gchar
* value
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
755 return dma_debugger_queue_append (self
, dma_command_new (DMA_EVALUATE_COMMAND
, name
, value
, callback
, user_data
));
759 dma_queue_send_command (DmaDebuggerQueue
*self
, const gchar
* command
)
761 return dma_debugger_queue_append (self
, dma_command_new (DMA_USER_COMMAND
, command
));
765 dma_queue_print (DmaDebuggerQueue
*self
, const gchar
* variable
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
767 return dma_debugger_queue_append (self
, dma_command_new (DMA_PRINT_COMMAND
, variable
, callback
, user_data
));
771 dma_queue_list_local (DmaDebuggerQueue
*self
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
773 return dma_debugger_queue_append (self
, dma_command_new (DMA_LIST_LOCAL_COMMAND
, callback
, user_data
));
777 dma_queue_list_argument (DmaDebuggerQueue
*self
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
779 return dma_debugger_queue_append (self
, dma_command_new (DMA_LIST_ARG_COMMAND
, callback
, user_data
));
783 dma_queue_list_thread (DmaDebuggerQueue
*self
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
785 return dma_debugger_queue_append (self
, dma_command_new (DMA_LIST_THREAD_COMMAND
, callback
, user_data
));
789 dma_queue_set_thread (DmaDebuggerQueue
*self
, gint thread
)
791 return dma_debugger_queue_append (self
, dma_command_new (DMA_SET_THREAD_COMMAND
, thread
));
795 dma_queue_info_thread (DmaDebuggerQueue
*self
, gint thread
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
797 return dma_debugger_queue_append (self
, dma_command_new (DMA_INFO_THREAD_COMMAND
, thread
, callback
, user_data
));
801 dma_queue_info_signal (DmaDebuggerQueue
*self
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
803 return dma_debugger_queue_append (self
, dma_command_new (DMA_INFO_SIGNAL_COMMAND
, callback
, user_data
));
807 dma_queue_info_sharedlib (DmaDebuggerQueue
*self
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
809 return dma_debugger_queue_append (self
, dma_command_new (DMA_INFO_SHAREDLIB_COMMAND
, callback
, user_data
));
813 dma_queue_handle_signal (DmaDebuggerQueue
*self
, const gchar
* name
, gboolean stop
, gboolean print
, gboolean ignore
)
815 return dma_debugger_queue_append (self
, dma_command_new (DMA_HANDLE_SIGNAL_COMMAND
, name
, stop
, print
, ignore
));
819 dma_queue_info_frame (DmaDebuggerQueue
*self
, guint frame
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
821 return dma_debugger_queue_append (self
, dma_command_new (DMA_INFO_FRAME_COMMAND
, frame
, callback
, user_data
));
825 dma_queue_info_args (DmaDebuggerQueue
*self
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
827 return dma_debugger_queue_append (self
, dma_command_new (DMA_INFO_ARGS_COMMAND
, callback
, user_data
));
831 dma_queue_info_target (DmaDebuggerQueue
*self
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
833 return dma_debugger_queue_append (self
, dma_command_new (DMA_INFO_TARGET_COMMAND
, callback
, user_data
));
837 dma_queue_info_program (DmaDebuggerQueue
*self
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
839 return dma_debugger_queue_append (self
, dma_command_new (DMA_INFO_PROGRAM_COMMAND
, callback
, user_data
));
843 dma_queue_info_udot (DmaDebuggerQueue
*self
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
845 return dma_debugger_queue_append (self
, dma_command_new (DMA_INFO_UDOT_COMMAND
, callback
, user_data
));
849 dma_queue_info_variables (DmaDebuggerQueue
*self
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
851 return dma_debugger_queue_append (self
, dma_command_new (DMA_INFO_VARIABLES_COMMAND
, callback
, user_data
));
855 dma_queue_set_frame (DmaDebuggerQueue
*self
, guint frame
)
857 return dma_debugger_queue_append (self
, dma_command_new (DMA_SET_FRAME_COMMAND
, frame
));
861 dma_queue_list_frame (DmaDebuggerQueue
*self
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
863 return dma_debugger_queue_append (self
, dma_command_new (DMA_LIST_FRAME_COMMAND
, callback
, user_data
));
867 dma_queue_callback (DmaDebuggerQueue
*self
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
869 return dma_debugger_queue_append (self
, dma_command_new (DMA_CALLBACK_COMMAND
, callback
, user_data
));
873 dma_queue_add_breakpoint_at_line (DmaDebuggerQueue
*self
, guint
*id
, const gchar
* file
, guint line
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
875 return dma_debugger_queue_append (self
, dma_command_new (DMA_BREAK_LINE_COMMAND
, id
, file
, line
, callback
, user_data
));
879 dma_queue_add_breakpoint_at_function (DmaDebuggerQueue
*self
, guint
*id
, const gchar
* file
, const gchar
* function
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
881 return dma_debugger_queue_append (self
, dma_command_new (DMA_BREAK_FUNCTION_COMMAND
, id
, file
, function
, callback
, user_data
));
885 dma_queue_add_breakpoint_at_address (DmaDebuggerQueue
*self
, guint
*id
, gulong address
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
887 return dma_debugger_queue_append (self
, dma_command_new (DMA_BREAK_ADDRESS_COMMAND
, id
, address
, callback
, user_data
));
891 dma_queue_enable_breakpoint (DmaDebuggerQueue
*self
, guint id
, gboolean enable
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
893 return dma_debugger_queue_append (self
, dma_command_new (DMA_ENABLE_BREAK_COMMAND
, id
, enable
, callback
, user_data
));
897 dma_queue_ignore_breakpoint (DmaDebuggerQueue
*self
, guint id
, guint ignore
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
899 return dma_debugger_queue_append (self
, dma_command_new (DMA_IGNORE_BREAK_COMMAND
, id
, ignore
, callback
, user_data
));
903 dma_queue_condition_breakpoint (DmaDebuggerQueue
*self
, guint id
, const gchar
*condition
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
905 return dma_debugger_queue_append (self
, dma_command_new (DMA_CONDITION_BREAK_COMMAND
, id
, condition
, callback
, user_data
));
909 dma_queue_remove_breakpoint (DmaDebuggerQueue
*self
, guint id
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
911 return dma_debugger_queue_append (self
, dma_command_new (DMA_REMOVE_BREAK_COMMAND
, id
, callback
, user_data
));
915 dma_queue_list_breakpoint (DmaDebuggerQueue
*self
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
917 return dma_debugger_queue_append (self
, dma_command_new (DMA_LIST_BREAK_COMMAND
, callback
, user_data
));
921 dma_queue_list_register (DmaDebuggerQueue
*self
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
923 return dma_debugger_queue_append (self
, dma_command_new (DMA_LIST_REGISTER_COMMAND
, callback
, user_data
));
927 dma_queue_update_register (DmaDebuggerQueue
*self
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
929 return dma_debugger_queue_append (self
, dma_command_new (DMA_UPDATE_REGISTER_COMMAND
, callback
, user_data
));
933 dma_queue_write_register (DmaDebuggerQueue
*self
, IAnjutaDebuggerRegisterData
*value
)
935 return dma_debugger_queue_append (self
, dma_command_new (DMA_WRITE_REGISTER_COMMAND
, value
));
939 dma_queue_inspect_memory (DmaDebuggerQueue
*self
, gulong address
, guint length
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
941 return dma_debugger_queue_append (self
, dma_command_new (DMA_INSPECT_MEMORY_COMMAND
, address
, length
, callback
, user_data
));
945 dma_queue_disassemble (DmaDebuggerQueue
*self
, gulong address
, guint length
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
947 return dma_debugger_queue_append (self
, dma_command_new (DMA_DISASSEMBLE_COMMAND
, address
, length
, callback
, user_data
));
951 dma_queue_delete_variable (DmaDebuggerQueue
*self
, const gchar
*name
)
953 return dma_debugger_queue_append (self
, dma_command_new (DMA_DELETE_VARIABLE_COMMAND
, name
));
957 dma_queue_evaluate_variable (DmaDebuggerQueue
*self
, const gchar
*name
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
959 return dma_debugger_queue_append (self
, dma_command_new (DMA_EVALUATE_VARIABLE_COMMAND
, name
, callback
, user_data
));
963 dma_queue_assign_variable (DmaDebuggerQueue
*self
, const gchar
*name
, const gchar
*value
)
965 return dma_debugger_queue_append (self
, dma_command_new (DMA_ASSIGN_VARIABLE_COMMAND
, name
, value
));
969 dma_queue_list_children (DmaDebuggerQueue
*self
, const gchar
*name
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
971 return dma_debugger_queue_append (self
, dma_command_new (DMA_LIST_VARIABLE_CHILDREN_COMMAND
, name
, callback
, user_data
));
975 dma_queue_create_variable (DmaDebuggerQueue
*self
, const gchar
*name
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
977 return dma_debugger_queue_append (self
, dma_command_new (DMA_CREATE_VARIABLE_COMMAND
, name
, callback
, user_data
));
981 dma_queue_update_variable (DmaDebuggerQueue
*self
, IAnjutaDebuggerCallback callback
, gpointer user_data
)
983 return dma_debugger_queue_append (self
, dma_command_new (DMA_UPDATE_VARIABLE_COMMAND
, callback
, user_data
));
987 dma_command_free (DmaQueueCommand
*cmd
)
989 DmaDebuggerCommandType type
= cmd
->type
& COMMAND_MASK
;
994 case CALLBACK_COMMAND
:
999 case STEP_IN_COMMAND
:
1000 case STEP_OVER_COMMAND
:
1001 case STEP_OUT_COMMAND
:
1002 case STEPI_IN_COMMAND
:
1003 case STEPI_OVER_COMMAND
:
1004 case RUN_TO_ADDRESS_COMMAND
:
1006 case INTERRUPT_COMMAND
:
1007 case ENABLE_BREAK_COMMAND
:
1008 case IGNORE_BREAK_COMMAND
:
1009 case REMOVE_BREAK_COMMAND
:
1010 case LIST_BREAK_COMMAND
:
1012 case LIST_LOCAL_COMMAND
:
1013 case LIST_ARG_COMMAND
:
1014 case INFO_THREAD_COMMAND
:
1015 case LIST_THREAD_COMMAND
:
1016 case SET_THREAD_COMMAND
:
1017 case INFO_SIGNAL_COMMAND
:
1018 case INFO_SHAREDLIB_COMMAND
:
1019 case INFO_FRAME_COMMAND
:
1020 case INFO_ARGS_COMMAND
:
1021 case INFO_TARGET_COMMAND
:
1022 case INFO_PROGRAM_COMMAND
:
1023 case INFO_UDOT_COMMAND
:
1024 case INFO_VARIABLES_COMMAND
:
1025 case LIST_REGISTER_COMMAND
:
1026 case UPDATE_REGISTER_COMMAND
:
1028 case SET_FRAME_COMMAND
:
1029 case LIST_FRAME_COMMAND
:
1030 case INSPECT_MEMORY_COMMAND
:
1031 case DISASSEMBLE_COMMAND
:
1033 case INSPECT_COMMAND
:
1034 case EVALUATE_COMMAND
:
1035 case WRITE_REGISTER_COMMAND
:
1036 if (cmd
->data
.watch
.name
!= NULL
) g_free (cmd
->data
.watch
.name
);
1037 if (cmd
->data
.watch
.value
!= NULL
) g_free (cmd
->data
.watch
.value
);
1040 if (cmd
->data
.start
.args
) g_free (cmd
->data
.start
.args
);
1043 if (cmd
->data
.load
.file
) g_free (cmd
->data
.load
.file
);
1044 if (cmd
->data
.load
.type
) g_free (cmd
->data
.load
.type
);
1045 g_list_foreach (cmd
->data
.load
.dirs
, (GFunc
)g_free
, NULL
);
1046 g_list_free (cmd
->data
.load
.dirs
);
1048 case SET_WORKING_DIRECTORY_COMMAND
:
1049 if (cmd
->data
.dir
) g_free (cmd
->data
.dir
);
1051 case SET_ENVIRONMENT_COMMAND
:
1052 g_strfreev (cmd
->data
.env
);
1054 case ATTACH_COMMAND
:
1055 g_list_foreach (cmd
->data
.attach
.dirs
, (GFunc
)g_free
, NULL
);
1056 g_list_free (cmd
->data
.attach
.dirs
);
1058 case RUN_TO_COMMAND
:
1059 case BREAK_LINE_COMMAND
:
1060 case BREAK_FUNCTION_COMMAND
:
1061 case BREAK_ADDRESS_COMMAND
:
1062 if (cmd
->data
.pos
.file
) g_free (cmd
->data
.pos
.file
);
1063 if (cmd
->data
.pos
.function
) g_free (cmd
->data
.pos
.function
);
1065 case CONDITION_BREAK_COMMAND
:
1066 if (cmd
->data
.brk
.condition
) g_free (cmd
->data
.brk
.condition
);
1069 if (cmd
->data
.user
.cmd
) g_free (cmd
->data
.user
.cmd
);
1072 if (cmd
->data
.print
.var
) g_free (cmd
->data
.print
.var
);
1074 case HANDLE_SIGNAL_COMMAND
:
1075 if (cmd
->data
.signal
.name
) g_free (cmd
->data
.signal
.name
);
1077 case DELETE_VARIABLE
:
1078 case ASSIGN_VARIABLE
:
1079 case CREATE_VARIABLE
:
1080 case EVALUATE_VARIABLE
:
1081 case LIST_VARIABLE_CHILDREN
:
1082 case UPDATE_VARIABLE
:
1083 if (cmd
->data
.var
.name
) g_free (cmd
->data
.var
.name
);
1092 dma_command_cancel (DmaQueueCommand
*cmd
)
1094 GError
*err
= g_error_new_literal (IANJUTA_DEBUGGER_ERROR
, IANJUTA_DEBUGGER_CANCEL
, "Command cancel");
1096 if (cmd
->callback
!= NULL
)
1098 cmd
->callback (NULL
, cmd
->user_data
, err
);
1103 g_warning ("Cancel command %x\n", cmd
->type
);
1105 dma_command_free (cmd
);
1108 /* It is possible that the queue contains several add breakpoint command
1109 * for the same one. Just before sending the command to the debugger check
1110 * that the breakpoint is still not set */
1113 dma_command_is_breakpoint_pending (DmaQueueCommand
*cmd
)
1117 if (*cmd
->data
.pos
.id
== 0) return TRUE
; /* Breakpoint is not set, can add it */
1119 err
= g_error_new (IANJUTA_DEBUGGER_ERROR
, IANJUTA_DEBUGGER_ALREADY_DONE
, "Breakpoint is already set with id %d", *cmd
->data
.pos
.id
);
1121 if (cmd
->callback
!= NULL
)
1123 cmd
->callback (NULL
, cmd
->user_data
, err
);
1131 dma_command_run (DmaQueueCommand
*cmd
, IAnjutaDebugger
*debugger
,
1132 DmaDebuggerQueue
*queue
, GError
**err
)
1134 IAnjutaDebuggerRegisterData reg
;
1135 gboolean ret
= FALSE
;
1136 DmaDebuggerCommandType type
= cmd
->type
& COMMAND_MASK
;
1137 IAnjutaDebuggerCallback callback
= cmd
->callback
== NULL
? NULL
: dma_debugger_queue_command_callback
;
1144 case CALLBACK_COMMAND
:
1145 ret
= ianjuta_debugger_callback (debugger
, callback
, queue
, err
);
1148 ret
= ianjuta_debugger_load (debugger
, cmd
->data
.load
.file
, cmd
->data
.load
.type
, cmd
->data
.load
.dirs
, err
);
1150 case ATTACH_COMMAND
:
1151 ret
= ianjuta_debugger_attach (debugger
, cmd
->data
.attach
.pid
, cmd
->data
.load
.dirs
, err
);
1153 case SET_WORKING_DIRECTORY_COMMAND
:
1154 ret
= ianjuta_debugger_set_working_directory (debugger
, cmd
->data
.dir
, err
);
1156 case SET_ENVIRONMENT_COMMAND
:
1157 ret
= ianjuta_debugger_set_environment (debugger
, cmd
->data
.env
, err
);
1159 case UNLOAD_COMMAND
:
1160 ret
= ianjuta_debugger_unload (debugger
, err
);
1163 ret
= ianjuta_debugger_quit (debugger
, err
);
1166 ret
= ianjuta_debugger_abort (debugger
, err
);
1169 ret
= ianjuta_debugger_start (debugger
, cmd
->data
.start
.args
, cmd
->data
.start
.terminal
, cmd
->data
.start
.stop
, err
);
1172 ret
= ianjuta_debugger_run (debugger
, err
);
1174 case RUN_TO_COMMAND
:
1175 file
= g_file_new_for_uri (cmd
->data
.pos
.file
);
1176 ret
= ianjuta_debugger_run_to (debugger
, file
, cmd
->data
.pos
.line
, err
);
1177 g_object_unref (file
);
1179 case STEP_IN_COMMAND
:
1180 ret
= ianjuta_debugger_step_in (debugger
, err
);
1182 case STEP_OVER_COMMAND
:
1183 ret
= ianjuta_debugger_step_over (debugger
, err
);
1185 case STEP_OUT_COMMAND
:
1186 ret
= ianjuta_debugger_step_out (debugger
, err
);
1188 case RUN_TO_ADDRESS_COMMAND
:
1189 ret
= ianjuta_debugger_instruction_run_to_address (IANJUTA_DEBUGGER_INSTRUCTION (debugger
), cmd
->data
.pos
.address
, err
);
1191 case STEPI_IN_COMMAND
:
1192 ret
= ianjuta_debugger_instruction_step_in (IANJUTA_DEBUGGER_INSTRUCTION (debugger
), err
);
1194 case STEPI_OVER_COMMAND
:
1195 ret
= ianjuta_debugger_instruction_step_over (IANJUTA_DEBUGGER_INSTRUCTION (debugger
), err
);
1198 ret
= ianjuta_debugger_exit (debugger
, err
);
1200 case INTERRUPT_COMMAND
:
1201 ret
= ianjuta_debugger_interrupt (debugger
, err
);
1203 case ENABLE_BREAK_COMMAND
:
1204 ret
= ianjuta_debugger_breakpoint_enable (IANJUTA_DEBUGGER_BREAKPOINT (debugger
), cmd
->data
.brk
.id
, cmd
->data
.brk
.enable
, callback
, queue
, err
);
1206 case IGNORE_BREAK_COMMAND
:
1207 ret
= ianjuta_debugger_breakpoint_ignore (IANJUTA_DEBUGGER_BREAKPOINT (debugger
), cmd
->data
.brk
.id
, cmd
->data
.brk
.ignore
, callback
, queue
, err
);
1209 case REMOVE_BREAK_COMMAND
:
1210 ret
= ianjuta_debugger_breakpoint_clear (IANJUTA_DEBUGGER_BREAKPOINT (debugger
), cmd
->data
.brk
.id
, callback
, queue
, err
);
1212 case BREAK_LINE_COMMAND
:
1213 if (dma_command_is_breakpoint_pending (cmd
))
1215 ret
= ianjuta_debugger_breakpoint_set_at_line (IANJUTA_DEBUGGER_BREAKPOINT (debugger
), cmd
->data
.pos
.file
, cmd
->data
.pos
.line
, callback
, queue
, err
);
1222 case BREAK_FUNCTION_COMMAND
:
1223 if (dma_command_is_breakpoint_pending (cmd
))
1225 ret
= ianjuta_debugger_breakpoint_set_at_function (IANJUTA_DEBUGGER_BREAKPOINT (debugger
), cmd
->data
.pos
.file
, cmd
->data
.pos
.function
, callback
, queue
, err
);
1232 case BREAK_ADDRESS_COMMAND
:
1233 if (dma_command_is_breakpoint_pending (cmd
))
1235 ret
= ianjuta_debugger_breakpoint_set_at_address (IANJUTA_DEBUGGER_BREAKPOINT (debugger
), cmd
->data
.pos
.address
, callback
, queue
, err
);
1242 case CONDITION_BREAK_COMMAND
:
1243 ret
= ianjuta_debugger_breakpoint_condition (IANJUTA_DEBUGGER_BREAKPOINT (debugger
), cmd
->data
.brk
.id
, cmd
->data
.brk
.condition
, callback
, queue
, err
);
1245 case LIST_BREAK_COMMAND
:
1246 ret
= ianjuta_debugger_breakpoint_list (IANJUTA_DEBUGGER_BREAKPOINT (debugger
), callback
, queue
, err
);
1248 case INSPECT_COMMAND
:
1249 ret
= ianjuta_debugger_inspect (debugger
, cmd
->data
.watch
.name
, callback
, queue
, err
);
1251 case EVALUATE_COMMAND
:
1252 ret
= ianjuta_debugger_evaluate (debugger
, cmd
->data
.watch
.name
, cmd
->data
.watch
.value
, callback
, queue
, err
);
1254 case LIST_LOCAL_COMMAND
:
1255 ret
= ianjuta_debugger_list_local (debugger
, callback
, queue
, err
);
1257 case LIST_ARG_COMMAND
:
1258 ret
= ianjuta_debugger_list_argument (debugger
, callback
, queue
, err
);
1260 case LIST_THREAD_COMMAND
:
1261 ret
= ianjuta_debugger_list_thread (debugger
, callback
, queue
, err
);
1263 case SET_THREAD_COMMAND
:
1264 ret
= ianjuta_debugger_set_thread (debugger
, cmd
->data
.frame
.frame
, err
);
1266 case INFO_THREAD_COMMAND
:
1267 ret
= ianjuta_debugger_info_thread (debugger
, cmd
->data
.info
.id
, callback
, queue
, err
);
1269 case INFO_SIGNAL_COMMAND
:
1270 ret
= ianjuta_debugger_info_signal (debugger
, callback
, queue
, err
);
1272 case INFO_SHAREDLIB_COMMAND
:
1273 ret
= ianjuta_debugger_info_sharedlib (debugger
, callback
, queue
, err
);
1275 case INFO_FRAME_COMMAND
:
1276 ret
= ianjuta_debugger_info_frame (debugger
, 0, callback
, queue
, err
);
1278 case INFO_ARGS_COMMAND
:
1279 ret
= ianjuta_debugger_info_args (debugger
, callback
, queue
, err
);
1281 case INFO_TARGET_COMMAND
:
1282 ret
= ianjuta_debugger_info_target (debugger
, callback
, queue
, err
);
1284 case INFO_PROGRAM_COMMAND
:
1285 ret
= ianjuta_debugger_info_program (debugger
, callback
, queue
, err
);
1287 case INFO_UDOT_COMMAND
:
1288 ret
= ianjuta_debugger_info_udot (debugger
, callback
, queue
, err
);
1290 case INFO_VARIABLES_COMMAND
:
1291 ret
= ianjuta_debugger_info_variables (debugger
, callback
, queue
, err
);
1293 case SET_FRAME_COMMAND
:
1294 ret
= ianjuta_debugger_set_frame (debugger
, cmd
->data
.frame
.frame
, err
);
1296 case LIST_FRAME_COMMAND
:
1297 ret
= ianjuta_debugger_list_frame (debugger
, callback
, queue
, err
);
1299 case LIST_REGISTER_COMMAND
:
1300 ret
= ianjuta_debugger_register_list (IANJUTA_DEBUGGER_REGISTER (debugger
), callback
, queue
, err
);
1302 case UPDATE_REGISTER_COMMAND
:
1303 ret
= ianjuta_debugger_register_update (IANJUTA_DEBUGGER_REGISTER (debugger
), callback
, queue
, err
);
1305 case WRITE_REGISTER_COMMAND
:
1306 reg
.num
= cmd
->data
.watch
.id
;
1307 reg
.name
= cmd
->data
.watch
.name
;
1308 reg
.value
= cmd
->data
.watch
.value
;
1309 ret
= ianjuta_debugger_register_write (IANJUTA_DEBUGGER_REGISTER (debugger
), ®
, err
);
1311 case INSPECT_MEMORY_COMMAND
:
1312 ret
= ianjuta_debugger_memory_inspect (IANJUTA_DEBUGGER_MEMORY (debugger
), cmd
->data
.mem
.address
, cmd
->data
.mem
.length
, callback
, queue
, err
);
1314 case DISASSEMBLE_COMMAND
:
1315 ret
= ianjuta_debugger_instruction_disassemble (IANJUTA_DEBUGGER_INSTRUCTION (debugger
), cmd
->data
.mem
.address
, cmd
->data
.mem
.length
, callback
, queue
, err
);
1318 ret
= ianjuta_debugger_send_command (debugger
, cmd
->data
.user
.cmd
, err
);
1321 ret
= ianjuta_debugger_print (debugger
, cmd
->data
.print
.var
, callback
, queue
, err
);
1323 case HANDLE_SIGNAL_COMMAND
:
1324 ret
= ianjuta_debugger_handle_signal (debugger
, cmd
->data
.signal
.name
, cmd
->data
.signal
.stop
, cmd
->data
.signal
.print
, cmd
->data
.signal
.ignore
, err
);
1326 case DELETE_VARIABLE
:
1327 ret
= ianjuta_debugger_variable_destroy (IANJUTA_DEBUGGER_VARIABLE (debugger
), cmd
->data
.var
.name
, NULL
);
1329 case ASSIGN_VARIABLE
:
1330 ret
= ianjuta_debugger_variable_assign (IANJUTA_DEBUGGER_VARIABLE (debugger
), cmd
->data
.var
.name
, cmd
->data
.var
.value
, err
);
1332 case EVALUATE_VARIABLE
:
1333 ret
= ianjuta_debugger_variable_evaluate (IANJUTA_DEBUGGER_VARIABLE (debugger
), cmd
->data
.var
.name
, callback
, queue
, err
);
1335 case LIST_VARIABLE_CHILDREN
:
1336 ret
= ianjuta_debugger_variable_list_children (IANJUTA_DEBUGGER_VARIABLE (debugger
), cmd
->data
.var
.name
, callback
, queue
, err
);
1338 case CREATE_VARIABLE
:
1339 ret
= ianjuta_debugger_variable_create (IANJUTA_DEBUGGER_VARIABLE (debugger
), cmd
->data
.var
.name
, callback
, queue
, err
);
1341 case UPDATE_VARIABLE
:
1342 ret
= ianjuta_debugger_variable_update (IANJUTA_DEBUGGER_VARIABLE (debugger
), callback
, queue
, err
);
1350 dma_command_callback (DmaQueueCommand
*cmd
, const gpointer data
, GError
*err
)
1352 DmaDebuggerCommandType type
= cmd
->type
& COMMAND_MASK
;
1358 case ATTACH_COMMAND
:
1359 case UNLOAD_COMMAND
:
1363 case SET_WORKING_DIRECTORY_COMMAND
:
1364 case SET_ENVIRONMENT_COMMAND
:
1366 case RUN_TO_COMMAND
:
1367 case STEP_IN_COMMAND
:
1368 case STEP_OVER_COMMAND
:
1369 case STEP_OUT_COMMAND
:
1370 case RUN_TO_ADDRESS_COMMAND
:
1371 case STEPI_IN_COMMAND
:
1372 case STEPI_OVER_COMMAND
:
1374 case INTERRUPT_COMMAND
:
1375 case SET_THREAD_COMMAND
:
1376 case SET_FRAME_COMMAND
:
1377 case WRITE_REGISTER_COMMAND
:
1379 case HANDLE_SIGNAL_COMMAND
:
1380 case DELETE_VARIABLE
:
1381 case ASSIGN_VARIABLE
:
1382 g_return_if_reached ();
1384 case CALLBACK_COMMAND
:
1385 case ENABLE_BREAK_COMMAND
:
1386 case IGNORE_BREAK_COMMAND
:
1387 case REMOVE_BREAK_COMMAND
:
1388 case BREAK_LINE_COMMAND
:
1389 case BREAK_FUNCTION_COMMAND
:
1390 case BREAK_ADDRESS_COMMAND
:
1391 case CONDITION_BREAK_COMMAND
:
1392 case LIST_BREAK_COMMAND
:
1393 case INSPECT_COMMAND
:
1394 case EVALUATE_COMMAND
:
1395 case LIST_LOCAL_COMMAND
:
1396 case LIST_ARG_COMMAND
:
1397 case LIST_THREAD_COMMAND
:
1398 case INFO_THREAD_COMMAND
:
1399 case INFO_SIGNAL_COMMAND
:
1400 case INFO_SHAREDLIB_COMMAND
:
1401 case INFO_FRAME_COMMAND
:
1402 case INFO_ARGS_COMMAND
:
1403 case INFO_TARGET_COMMAND
:
1404 case INFO_PROGRAM_COMMAND
:
1405 case INFO_UDOT_COMMAND
:
1406 case INFO_VARIABLES_COMMAND
:
1407 case LIST_FRAME_COMMAND
:
1408 case LIST_REGISTER_COMMAND
:
1409 case UPDATE_REGISTER_COMMAND
:
1410 case INSPECT_MEMORY_COMMAND
:
1411 case DISASSEMBLE_COMMAND
:
1413 case EVALUATE_VARIABLE
:
1414 case LIST_VARIABLE_CHILDREN
:
1415 case CREATE_VARIABLE
:
1416 case UPDATE_VARIABLE
:
1417 if (cmd
->callback
!= NULL
)
1419 cmd
->callback (data
, cmd
->user_data
, err
);
1426 dma_command_is_valid_in_state (DmaQueueCommand
*cmd
, IAnjutaDebuggerState state
)
1428 return cmd
->type
& 1 << (state
+ STATE_TO_NEED
- 1);
1431 IAnjutaDebuggerState
1432 dma_command_is_going_to_state (DmaQueueCommand
*cmd
)
1434 IAnjutaDebuggerState state
;
1436 switch (cmd
->type
& CHANGE_MASK
)
1439 state
= IANJUTA_DEBUGGER_STOPPED
;
1441 case START_DEBUGGER
:
1442 state
= IANJUTA_DEBUGGER_STARTED
;
1445 state
= IANJUTA_DEBUGGER_PROGRAM_LOADED
;
1448 state
= IANJUTA_DEBUGGER_PROGRAM_STOPPED
;
1451 state
= IANJUTA_DEBUGGER_PROGRAM_RUNNING
;
1454 state
= IANJUTA_DEBUGGER_BUSY
;
1461 dma_command_has_flag (DmaQueueCommand
*cmd
, DmaCommandFlag flag
)
1463 return cmd
->type
& flag
;
1467 dma_command_get_type (DmaQueueCommand
*cmd
)
1469 return (int)cmd
->type
;