1 /* Darwin support for GDB, the GNU debugger.
2 Copyright (C) 2008-2023 Free Software Foundation, Inc.
4 Contributed by AdaCore.
6 This file is part of GDB.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
30 #include "gdbthread.h"
32 #include "event-top.h"
35 #include "inf-child.h"
37 #include "arch-utils.h"
39 #include "bfd/mach-o.h"
43 #include <sys/ptrace.h>
44 #include <sys/signal.h>
46 #include <sys/types.h>
50 #include <sys/sysctl.h>
53 #include <sys/syscall.h>
56 #include <mach/mach_error.h>
57 #include <mach/mach_vm.h>
58 #include <mach/mach_init.h>
59 #include <mach/vm_map.h>
60 #include <mach/task.h>
61 #include <mach/mach_port.h>
62 #include <mach/thread_act.h>
63 #include <mach/port.h>
65 #include "darwin-nat.h"
66 #include "filenames.h"
67 #include "gdbsupport/filestuff.h"
68 #include "gdbsupport/gdb_unlinker.h"
69 #include "gdbsupport/pathstuff.h"
70 #include "gdbsupport/scoped_fd.h"
71 #include "nat/fork-inferior.h"
74 Darwin kernel is Mach + BSD derived kernel. Note that they share the
75 same memory space and are linked together (ie there is no micro-kernel).
77 Although ptrace(2) is available on Darwin, it is not complete. We have
78 to use Mach calls to read and write memory and to modify registers. We
79 also use Mach to get inferior faults. As we cannot use select(2) or
80 signals with Mach port (the Mach communication channel), signals are
81 reported to gdb as an exception. Furthermore we detect death of the
82 inferior through a Mach notification message. This way we only wait
85 Some Mach documentation is available for Apple xnu source package or
89 #define PTRACE(CMD, PID, ADDR, SIG) \
90 darwin_ptrace(#CMD, CMD, (PID), (ADDR), (SIG))
92 static void darwin_ptrace_me (void);
94 static void darwin_encode_reply (mig_reply_error_t
*reply
,
95 mach_msg_header_t
*hdr
, integer_t code
);
97 static void darwin_setup_request_notification (struct inferior
*inf
);
98 static void darwin_deallocate_exception_ports (darwin_inferior
*inf
);
99 static void darwin_setup_exceptions (struct inferior
*inf
);
100 static void darwin_deallocate_threads (struct inferior
*inf
);
102 /* Task identifier of gdb. */
103 static task_t gdb_task
;
105 /* A copy of mach_host_self (). */
106 mach_port_t darwin_host_self
;
108 /* Exception port. */
109 mach_port_t darwin_ex_port
;
111 /* Port set, to wait for answer on all ports. */
112 mach_port_t darwin_port_set
;
115 static vm_size_t mach_page_size
;
117 /* If Set, catch all mach exceptions (before they are converted to signals
119 static bool enable_mach_exceptions
;
121 /* Inferior that should report a fake stop event. */
122 static struct inferior
*darwin_inf_fake_stop
;
124 /* If non-NULL, the shell we actually invoke. See maybe_cache_shell
126 static const char *copied_shell
;
128 #define PAGE_TRUNC(x) ((x) & ~(mach_page_size - 1))
129 #define PAGE_ROUND(x) PAGE_TRUNC((x) + mach_page_size - 1)
131 /* This controls output of inferior debugging. */
132 static unsigned int darwin_debug_flag
= 0;
134 /* Create a __TEXT __info_plist section in the executable so that gdb could
135 be signed. This is required to get an authorization for task_for_pid.
137 Once gdb is built, you must codesign it with any system-trusted signing
138 authority. See taskgated(8) for details. */
139 static const unsigned char info_plist
[]
140 __attribute__ ((section ("__TEXT,__info_plist"),used
)) =
141 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
142 "<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\""
143 " \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
144 "<plist version=\"1.0\">\n"
146 " <key>CFBundleIdentifier</key>\n"
147 " <string>org.gnu.gdb</string>\n"
148 " <key>CFBundleName</key>\n"
149 " <string>gdb</string>\n"
150 " <key>CFBundleVersion</key>\n"
151 " <string>1.0</string>\n"
152 " <key>SecTaskAccess</key>\n"
154 " <string>allowed</string>\n"
155 " <string>debug</string>\n"
160 static void inferior_debug (int level
, const char *fmt
, ...)
161 ATTRIBUTE_PRINTF (2, 3);
164 inferior_debug (int level
, const char *fmt
, ...)
168 if (darwin_debug_flag
< level
)
172 gdb_printf (gdb_stdlog
, _("[%d inferior]: "), getpid ());
173 gdb_vprintf (gdb_stdlog
, fmt
, ap
);
178 mach_check_error (kern_return_t ret
, const char *file
,
179 unsigned int line
, const char *func
)
181 if (ret
== KERN_SUCCESS
)
184 func
= _("[UNKNOWN]");
186 warning (_("Mach error at \"%s:%u\" in function \"%s\": %s (0x%lx)"),
187 file
, line
, func
, mach_error_string (ret
), (unsigned long) ret
);
191 unparse_exception_type (unsigned int i
)
193 static char unknown_exception_buf
[32];
198 return "EXC_BAD_ACCESS";
199 case EXC_BAD_INSTRUCTION
:
200 return "EXC_BAD_INSTRUCTION";
202 return "EXC_ARITHMETIC";
204 return "EXC_EMULATION";
206 return "EXC_SOFTWARE";
208 return "EXC_BREAKPOINT";
210 return "EXC_SYSCALL";
211 case EXC_MACH_SYSCALL
:
212 return "EXC_MACH_SYSCALL";
214 return "EXC_RPC_ALERT";
218 snprintf (unknown_exception_buf
, 32, _("unknown (%d)"), i
);
219 return unknown_exception_buf
;
223 /* Set errno to zero, and then call ptrace with the given arguments.
224 If inferior debugging traces are on, then also print a debug
227 The returned value is the same as the value returned by ptrace,
228 except in the case where that value is -1 but errno is zero.
229 This case is documented to be a non-error situation, so we
230 return zero in that case. */
233 darwin_ptrace (const char *name
,
234 int request
, int pid
, caddr_t arg3
, int arg4
)
239 ret
= ptrace (request
, pid
, arg3
, arg4
);
240 if (ret
== -1 && errno
== 0)
243 inferior_debug (4, _("ptrace (%s, %d, 0x%lx, %d): %d (%s)\n"),
244 name
, pid
, (unsigned long) arg3
, arg4
, ret
,
245 (ret
!= 0) ? safe_strerror (errno
) : _("no error"));
250 cmp_thread_t (const void *l
, const void *r
)
252 thread_t tl
= *(const thread_t
*)l
;
253 thread_t tr
= *(const thread_t
*)r
;
254 return (int)(tl
- tr
);
258 darwin_nat_target::check_new_threads (inferior
*inf
)
261 thread_array_t thread_list
;
262 unsigned int new_nbr
;
263 unsigned int old_nbr
;
264 unsigned int new_ix
, old_ix
;
265 darwin_inferior
*darwin_inf
= get_darwin_inferior (inf
);
266 std::vector
<darwin_thread_t
*> new_thread_vec
;
268 if (darwin_inf
== nullptr)
271 /* Get list of threads. */
272 kret
= task_threads (darwin_inf
->task
, &thread_list
, &new_nbr
);
273 MACH_CHECK_ERROR (kret
);
274 if (kret
!= KERN_SUCCESS
)
279 qsort (thread_list
, new_nbr
, sizeof (thread_t
), cmp_thread_t
);
281 old_nbr
= darwin_inf
->threads
.size ();
283 /* Quick check for no changes. */
284 if (old_nbr
== new_nbr
)
288 for (i
= 0; i
< new_nbr
; i
++)
289 if (thread_list
[i
] != darwin_inf
->threads
[i
]->gdb_port
)
293 /* Deallocate ports. */
294 for (i
= 0; i
< new_nbr
; i
++)
296 kret
= mach_port_deallocate (mach_task_self (), thread_list
[i
]);
297 MACH_CHECK_ERROR (kret
);
300 /* Deallocate the buffer. */
301 kret
= vm_deallocate (gdb_task
, (vm_address_t
) thread_list
,
302 new_nbr
* sizeof (int));
303 MACH_CHECK_ERROR (kret
);
309 /* Full handling: detect new threads, remove dead threads. */
311 new_thread_vec
.reserve (new_nbr
);
313 for (new_ix
= 0, old_ix
= 0; new_ix
< new_nbr
|| old_ix
< old_nbr
;)
315 thread_t new_id
= (new_ix
< new_nbr
) ? thread_list
[new_ix
] : THREAD_NULL
;
317 = (old_ix
< old_nbr
) ? darwin_inf
->threads
[old_ix
] : NULL
;
318 thread_t old_id
= old
!= NULL
? old
->gdb_port
: THREAD_NULL
;
321 (12, _(" new_ix:%d/%d, old_ix:%d/%d, new_id:0x%x old_id:0x%x\n"),
322 new_ix
, new_nbr
, old_ix
, old_nbr
, new_id
, old_id
);
324 if (old_id
== new_id
)
326 /* Thread still exist. */
327 new_thread_vec
.push_back (old
);
331 /* Deallocate the port. */
332 kret
= mach_port_deallocate (gdb_task
, new_id
);
333 MACH_CHECK_ERROR (kret
);
337 if (new_ix
< new_nbr
&& new_id
== MACH_PORT_DEAD
)
339 /* Ignore dead ports.
340 In some weird cases, we might get dead ports. They should
341 correspond to dead thread so they could safely be ignored. */
345 if (new_ix
< new_nbr
&& (old_ix
== old_nbr
|| new_id
< old_id
))
347 /* A thread was created. */
348 darwin_thread_info
*pti
= new darwin_thread_info
;
350 pti
->gdb_port
= new_id
;
351 pti
->msg_state
= DARWIN_RUNNING
;
353 /* Add the new thread. */
354 add_thread_with_info (this, ptid_t (inf
->pid
, 0, new_id
), pti
);
355 new_thread_vec
.push_back (pti
);
359 if (old_ix
< old_nbr
&& (new_ix
== new_nbr
|| new_id
> old_id
))
361 /* A thread was removed. */
362 struct thread_info
*thr
363 = this->find_thread (ptid_t (inf
->pid
, 0, old_id
));
365 kret
= mach_port_deallocate (gdb_task
, old_id
);
366 MACH_CHECK_ERROR (kret
);
370 gdb_assert_not_reached ("unexpected thread case");
373 darwin_inf
->threads
= std::move (new_thread_vec
);
375 /* Deallocate the buffer. */
376 kret
= vm_deallocate (gdb_task
, (vm_address_t
) thread_list
,
377 new_nbr
* sizeof (int));
378 MACH_CHECK_ERROR (kret
);
381 /* Return an inferior by task port. */
382 static struct inferior
*
383 darwin_find_inferior_by_task (task_t port
)
385 for (inferior
*inf
: all_inferiors ())
387 darwin_inferior
*priv
= get_darwin_inferior (inf
);
389 if (priv
!= nullptr && priv
->task
== port
)
395 /* Return an inferior by pid port. */
396 static struct inferior
*
397 darwin_find_inferior_by_pid (int pid
)
399 for (inferior
*inf
: all_inferiors ())
407 /* Return a thread by port. */
408 static darwin_thread_t
*
409 darwin_find_thread (struct inferior
*inf
, thread_t thread
)
411 darwin_inferior
*priv
= get_darwin_inferior (inf
);
414 for (darwin_thread_t
*t
: priv
->threads
)
416 if (t
->gdb_port
== thread
)
423 /* Suspend (ie stop) an inferior at Mach level. */
426 darwin_suspend_inferior (struct inferior
*inf
)
428 darwin_inferior
*priv
= get_darwin_inferior (inf
);
430 if (priv
!= nullptr && !priv
->suspended
)
434 kret
= task_suspend (priv
->task
);
435 MACH_CHECK_ERROR (kret
);
441 /* Resume an inferior at Mach level. */
444 darwin_resume_inferior (struct inferior
*inf
)
446 darwin_inferior
*priv
= get_darwin_inferior (inf
);
448 if (priv
!= nullptr && priv
->suspended
)
452 kret
= task_resume (priv
->task
);
453 MACH_CHECK_ERROR (kret
);
460 darwin_dump_message (mach_msg_header_t
*hdr
, int disp_body
)
462 gdb_printf (gdb_stdlog
,
463 _("message header:\n"));
464 gdb_printf (gdb_stdlog
,
465 _(" bits: 0x%x\n"), hdr
->msgh_bits
);
466 gdb_printf (gdb_stdlog
,
467 _(" size: 0x%x\n"), hdr
->msgh_size
);
468 gdb_printf (gdb_stdlog
,
469 _(" remote-port: 0x%x\n"), hdr
->msgh_remote_port
);
470 gdb_printf (gdb_stdlog
,
471 _(" local-port: 0x%x\n"), hdr
->msgh_local_port
);
472 gdb_printf (gdb_stdlog
,
473 _(" reserved: 0x%x\n"), hdr
->msgh_reserved
);
474 gdb_printf (gdb_stdlog
,
475 _(" id: 0x%x\n"), hdr
->msgh_id
);
479 const unsigned char *data
;
480 const unsigned int *ldata
;
484 data
= (unsigned char *)(hdr
+ 1);
485 size
= hdr
->msgh_size
- sizeof (mach_msg_header_t
);
487 if (hdr
->msgh_bits
& MACH_MSGH_BITS_COMPLEX
)
489 mach_msg_body_t
*bod
= (mach_msg_body_t
*)data
;
490 mach_msg_port_descriptor_t
*desc
=
491 (mach_msg_port_descriptor_t
*)(bod
+ 1);
494 gdb_printf (gdb_stdlog
,
495 _("body: descriptor_count=%u\n"),
496 bod
->msgh_descriptor_count
);
497 data
+= sizeof (mach_msg_body_t
);
498 size
-= sizeof (mach_msg_body_t
);
499 for (k
= 0; k
< bod
->msgh_descriptor_count
; k
++)
500 switch (desc
[k
].type
)
502 case MACH_MSG_PORT_DESCRIPTOR
:
505 _(" descr %d: type=%u (port) name=0x%x, dispo=%d\n"),
506 k
, desc
[k
].type
, desc
[k
].name
, desc
[k
].disposition
);
509 gdb_printf (gdb_stdlog
,
510 _(" descr %d: type=%u\n"),
514 data
+= bod
->msgh_descriptor_count
515 * sizeof (mach_msg_port_descriptor_t
);
516 size
-= bod
->msgh_descriptor_count
517 * sizeof (mach_msg_port_descriptor_t
);
518 ndr
= (NDR_record_t
*)(desc
+ bod
->msgh_descriptor_count
);
521 _("NDR: mig=%02x if=%02x encod=%02x "
522 "int=%02x char=%02x float=%02x\n"),
523 ndr
->mig_vers
, ndr
->if_vers
, ndr
->mig_encoding
,
524 ndr
->int_rep
, ndr
->char_rep
, ndr
->float_rep
);
525 data
+= sizeof (NDR_record_t
);
526 size
-= sizeof (NDR_record_t
);
529 gdb_printf (gdb_stdlog
, _(" data:"));
530 ldata
= (const unsigned int *)data
;
531 for (i
= 0; i
< size
/ sizeof (unsigned int); i
++)
532 gdb_printf (gdb_stdlog
, " %08x", ldata
[i
]);
533 gdb_printf (gdb_stdlog
, _("\n"));
537 /* Adjust inferior data when a new task was created. */
539 static struct inferior
*
540 darwin_find_new_inferior (task_t task_port
, thread_t thread_port
)
543 struct inferior
*inf
;
547 /* Find the corresponding pid. */
548 kret
= pid_for_task (task_port
, &task_pid
);
549 if (kret
!= KERN_SUCCESS
)
551 MACH_CHECK_ERROR (kret
);
555 /* Find the inferior for this pid. */
556 inf
= darwin_find_inferior_by_pid (task_pid
);
560 darwin_inferior
*priv
= get_darwin_inferior (inf
);
562 /* Deallocate saved exception ports. */
563 darwin_deallocate_exception_ports (priv
);
565 /* No need to remove dead_name notification, but still... */
566 kret
= mach_port_request_notification (gdb_task
, priv
->task
,
567 MACH_NOTIFY_DEAD_NAME
, 0,
569 MACH_MSG_TYPE_MAKE_SEND_ONCE
,
571 if (kret
!= KERN_INVALID_ARGUMENT
)
572 MACH_CHECK_ERROR (kret
);
574 /* Replace old task port. */
575 kret
= mach_port_deallocate (gdb_task
, priv
->task
);
576 MACH_CHECK_ERROR (kret
);
577 priv
->task
= task_port
;
579 darwin_setup_request_notification (inf
);
580 darwin_setup_exceptions (inf
);
585 /* Check data representation. */
588 darwin_check_message_ndr (NDR_record_t
*ndr
)
590 if (ndr
->mig_vers
!= NDR_PROTOCOL_2_0
591 || ndr
->if_vers
!= NDR_PROTOCOL_2_0
592 || ndr
->mig_encoding
!= NDR_record
.mig_encoding
593 || ndr
->int_rep
!= NDR_record
.int_rep
594 || ndr
->char_rep
!= NDR_record
.char_rep
595 || ndr
->float_rep
!= NDR_record
.float_rep
)
600 /* Decode an exception message. */
603 darwin_nat_target::decode_exception_message (mach_msg_header_t
*hdr
,
605 darwin_thread_t
**pthread
)
607 mach_msg_body_t
*bod
= (mach_msg_body_t
*)(hdr
+ 1);
608 mach_msg_port_descriptor_t
*desc
= (mach_msg_port_descriptor_t
*)(bod
+ 1);
611 struct inferior
*inf
;
612 darwin_thread_t
*thread
;
614 thread_t thread_port
;
618 /* Check message destination. */
619 if (hdr
->msgh_local_port
!= darwin_ex_port
)
622 /* Check message header. */
623 if (!(hdr
->msgh_bits
& MACH_MSGH_BITS_COMPLEX
))
626 /* Check descriptors. */
627 if (hdr
->msgh_size
< (sizeof (*hdr
) + sizeof (*bod
) + 2 * sizeof (*desc
)
628 + sizeof (*ndr
) + 2 * sizeof (integer_t
))
629 || bod
->msgh_descriptor_count
!= 2
630 || desc
[0].type
!= MACH_MSG_PORT_DESCRIPTOR
631 || desc
[0].disposition
!= MACH_MSG_TYPE_MOVE_SEND
632 || desc
[1].type
!= MACH_MSG_PORT_DESCRIPTOR
633 || desc
[1].disposition
!= MACH_MSG_TYPE_MOVE_SEND
)
636 /* Check data representation. */
637 ndr
= (NDR_record_t
*)(desc
+ 2);
638 if (darwin_check_message_ndr (ndr
) != 0)
641 /* Ok, the hard work. */
642 data
= (integer_t
*)(ndr
+ 1);
644 task_port
= desc
[1].name
;
645 thread_port
= desc
[0].name
;
647 /* Find process by port. */
648 inf
= darwin_find_inferior_by_task (task_port
);
651 if (inf
== NULL
&& data
[0] == EXC_SOFTWARE
&& data
[1] == 2
652 && data
[2] == EXC_SOFT_SIGNAL
&& data
[3] == SIGTRAP
)
654 /* Not a known inferior, but a sigtrap. This happens on darwin 16.1.0,
655 as a new Mach task is created when a process exec. */
656 inf
= darwin_find_new_inferior (task_port
, thread_port
);
661 /* Deallocate task_port, unless it was saved. */
662 kret
= mach_port_deallocate (mach_task_self (), task_port
);
663 MACH_CHECK_ERROR (kret
);
668 /* We got new rights to the task, get rid of it. Do not get rid of
669 thread right, as we will need it to find the thread. */
670 kret
= mach_port_deallocate (mach_task_self (), task_port
);
671 MACH_CHECK_ERROR (kret
);
676 /* Not a known inferior. This could happen if the child fork, as
677 the created process will inherit its exception port.
678 FIXME: should the exception port be restored ? */
679 mig_reply_error_t reply
;
682 (4, _("darwin_decode_exception_message: unknown task 0x%x\n"),
685 /* Free thread port (we don't know it). */
686 kret
= mach_port_deallocate (mach_task_self (), thread_port
);
687 MACH_CHECK_ERROR (kret
);
689 darwin_encode_reply (&reply
, hdr
, KERN_SUCCESS
);
691 kret
= mach_msg (&reply
.Head
, MACH_SEND_MSG
| MACH_SEND_INTERRUPT
,
692 reply
.Head
.msgh_size
, 0,
693 MACH_PORT_NULL
, MACH_MSG_TIMEOUT_NONE
,
695 MACH_CHECK_ERROR (kret
);
700 /* Find thread by port. */
701 /* Check for new threads. Do it early so that the port in the exception
702 message can be deallocated. */
703 check_new_threads (inf
);
705 /* Free the thread port (as gdb knows the thread, it has already has a right
706 for it, so this just decrement a reference counter). */
707 kret
= mach_port_deallocate (mach_task_self (), thread_port
);
708 MACH_CHECK_ERROR (kret
);
710 thread
= darwin_find_thread (inf
, thread_port
);
715 /* The thread should be running. However we have observed cases where a
716 thread got a SIGTTIN message after being stopped. */
717 gdb_assert (thread
->msg_state
!= DARWIN_MESSAGE
);
719 /* Finish decoding. */
720 thread
->event
.header
= *hdr
;
721 thread
->event
.thread_port
= thread_port
;
722 thread
->event
.task_port
= task_port
;
723 thread
->event
.ex_type
= data
[0];
724 thread
->event
.data_count
= data
[1];
726 if (hdr
->msgh_size
< (sizeof (*hdr
) + sizeof (*bod
) + 2 * sizeof (*desc
)
727 + sizeof (*ndr
) + 2 * sizeof (integer_t
)
728 + data
[1] * sizeof (integer_t
)))
730 for (i
= 0; i
< data
[1]; i
++)
731 thread
->event
.ex_data
[i
] = data
[2 + i
];
733 thread
->msg_state
= DARWIN_MESSAGE
;
738 /* Decode dead_name notify message. */
741 darwin_decode_notify_message (mach_msg_header_t
*hdr
, struct inferior
**pinf
)
743 NDR_record_t
*ndr
= (NDR_record_t
*)(hdr
+ 1);
744 integer_t
*data
= (integer_t
*)(ndr
+ 1);
745 struct inferior
*inf
;
748 /* Check message header. */
749 if (hdr
->msgh_bits
& MACH_MSGH_BITS_COMPLEX
)
752 /* Check descriptors. */
753 if (hdr
->msgh_size
< (sizeof (*hdr
) + sizeof (*ndr
) + sizeof (integer_t
)))
756 /* Check data representation. */
757 if (darwin_check_message_ndr (ndr
) != 0)
762 /* Find process by port. */
763 inf
= darwin_find_inferior_by_task (task_port
);
766 /* Check message destination. */
769 darwin_inferior
*priv
= get_darwin_inferior (inf
);
770 if (hdr
->msgh_local_port
!= priv
->notify_port
)
778 darwin_encode_reply (mig_reply_error_t
*reply
, mach_msg_header_t
*hdr
,
781 mach_msg_header_t
*rh
= &reply
->Head
;
783 rh
->msgh_bits
= MACH_MSGH_BITS (MACH_MSGH_BITS_REMOTE (hdr
->msgh_bits
), 0);
784 rh
->msgh_remote_port
= hdr
->msgh_remote_port
;
785 rh
->msgh_size
= (mach_msg_size_t
) sizeof (mig_reply_error_t
);
786 rh
->msgh_local_port
= MACH_PORT_NULL
;
787 rh
->msgh_id
= hdr
->msgh_id
+ 100;
789 reply
->NDR
= NDR_record
;
790 reply
->RetCode
= code
;
794 darwin_send_reply (struct inferior
*inf
, darwin_thread_t
*thread
)
797 mig_reply_error_t reply
;
798 darwin_inferior
*priv
= get_darwin_inferior (inf
);
800 darwin_encode_reply (&reply
, &thread
->event
.header
, KERN_SUCCESS
);
802 kret
= mach_msg (&reply
.Head
, MACH_SEND_MSG
| MACH_SEND_INTERRUPT
,
803 reply
.Head
.msgh_size
, 0,
804 MACH_PORT_NULL
, MACH_MSG_TIMEOUT_NONE
,
806 MACH_CHECK_ERROR (kret
);
808 priv
->pending_messages
--;
811 /* Wrapper around the __pthread_kill syscall. We use this instead of the
812 pthread_kill function to be able to send a signal to any kind of thread,
813 including GCD threads. */
816 darwin_pthread_kill (darwin_thread_t
*thread
, int nsignal
)
819 DIAGNOSTIC_IGNORE_DEPRECATED_DECLARATIONS
;
820 int res
= syscall (SYS___pthread_kill
, thread
->gdb_port
, nsignal
);
826 darwin_resume_thread (struct inferior
*inf
, darwin_thread_t
*thread
,
827 int step
, int nsignal
)
830 (3, _("darwin_resume_thread: state=%d, thread=0x%x, step=%d nsignal=%d\n"),
831 thread
->msg_state
, thread
->gdb_port
, step
, nsignal
);
833 switch (thread
->msg_state
)
836 if (thread
->event
.ex_type
== EXC_SOFTWARE
837 && thread
->event
.ex_data
[0] == EXC_SOFT_SIGNAL
)
839 /* Either deliver a new signal or cancel the signal received. */
840 int res
= PTRACE (PT_THUPDATE
, inf
->pid
,
841 (caddr_t
) (uintptr_t) thread
->gdb_port
, nsignal
);
843 inferior_debug (1, _("ptrace THUP: res=%d\n"), res
);
847 /* Note: ptrace is allowed only if the process is stopped.
848 Directly send the signal to the thread. */
849 int res
= darwin_pthread_kill (thread
, nsignal
);
850 inferior_debug (4, _("darwin_resume_thread: kill 0x%x %d: %d\n"),
851 thread
->gdb_port
, nsignal
, res
);
852 thread
->signaled
= 1;
855 /* Set or reset single step. */
856 inferior_debug (4, _("darwin_set_sstep (thread=0x%x, enable=%d)\n"),
857 thread
->gdb_port
, step
);
858 darwin_set_sstep (thread
->gdb_port
, step
);
859 thread
->single_step
= step
;
861 darwin_send_reply (inf
, thread
);
862 thread
->msg_state
= DARWIN_RUNNING
;
869 kern_return_t kret
= thread_resume (thread
->gdb_port
);
870 MACH_CHECK_ERROR (kret
);
872 thread
->msg_state
= DARWIN_RUNNING
;
877 /* Resume all threads of the inferior. */
880 darwin_resume_inferior_threads (struct inferior
*inf
, int step
, int nsignal
)
882 darwin_inferior
*priv
= get_darwin_inferior (inf
);
885 for (darwin_thread_t
*thread
: priv
->threads
)
886 darwin_resume_thread (inf
, thread
, step
, nsignal
);
889 /* Suspend all threads of INF. */
892 darwin_suspend_inferior_threads (struct inferior
*inf
)
894 darwin_inferior
*priv
= get_darwin_inferior (inf
);
896 for (darwin_thread_t
*thread
: priv
->threads
)
898 switch (thread
->msg_state
)
905 kern_return_t kret
= thread_suspend (thread
->gdb_port
);
906 MACH_CHECK_ERROR (kret
);
907 thread
->msg_state
= DARWIN_STOPPED
;
915 darwin_nat_target::resume (ptid_t ptid
, int step
, enum gdb_signal signal
)
920 (2, _("darwin_resume: ptid=%s, step=%d, signal=%d\n"),
921 ptid
.to_string ().c_str (), step
, signal
);
923 if (signal
== GDB_SIGNAL_0
)
926 nsignal
= gdb_signal_to_host (signal
);
928 /* Don't try to single step all threads. */
930 ptid
= inferior_ptid
;
932 /* minus_one_ptid is RESUME_ALL. */
933 if (ptid
== minus_one_ptid
)
935 /* Resume threads. */
936 for (inferior
*inf
: all_inferiors ())
937 darwin_resume_inferior_threads (inf
, step
, nsignal
);
940 for (inferior
*inf
: all_inferiors ())
941 darwin_resume_inferior (inf
);
945 inferior
*inf
= find_inferior_ptid (this, ptid
);
946 long tid
= ptid
.tid ();
948 /* Stop the inferior (should be useless). */
949 darwin_suspend_inferior (inf
);
952 darwin_resume_inferior_threads (inf
, step
, nsignal
);
955 darwin_thread_t
*thread
;
957 /* Suspend threads of the task. */
958 darwin_suspend_inferior_threads (inf
);
960 /* Resume the selected thread. */
961 thread
= darwin_find_thread (inf
, tid
);
963 darwin_resume_thread (inf
, thread
, step
, nsignal
);
966 /* Resume the task. */
967 darwin_resume_inferior (inf
);
972 darwin_nat_target::decode_message (mach_msg_header_t
*hdr
,
973 darwin_thread_t
**pthread
,
975 target_waitstatus
*status
)
977 darwin_thread_t
*thread
;
978 struct inferior
*inf
;
980 /* Exception message. 2401 == 0x961 is exc. */
981 if (hdr
->msgh_id
== 2401)
985 /* Decode message. */
986 res
= decode_exception_message (hdr
, &inf
, &thread
);
990 /* Should not happen... */
991 warning (_("darwin_wait: ill-formatted message (id=0x%x)\n"),
993 /* FIXME: send a failure reply? */
994 status
->set_ignore ();
995 return minus_one_ptid
;
999 status
->set_ignore ();
1000 return minus_one_ptid
;
1005 darwin_inferior
*priv
= get_darwin_inferior (inf
);
1007 priv
->pending_messages
++;
1009 thread
->msg_state
= DARWIN_MESSAGE
;
1011 inferior_debug (4, _("darwin_wait: thread=0x%x, got %s\n"),
1013 unparse_exception_type (thread
->event
.ex_type
));
1015 switch (thread
->event
.ex_type
)
1017 case EXC_BAD_ACCESS
:
1018 status
->set_stopped (GDB_EXC_BAD_ACCESS
);
1020 case EXC_BAD_INSTRUCTION
:
1021 status
->set_stopped (GDB_EXC_BAD_INSTRUCTION
);
1023 case EXC_ARITHMETIC
:
1024 status
->set_stopped (GDB_EXC_ARITHMETIC
);
1027 status
->set_stopped (GDB_EXC_EMULATION
);
1030 if (thread
->event
.ex_data
[0] == EXC_SOFT_SIGNAL
)
1033 (gdb_signal_from_host (thread
->event
.ex_data
[1]));
1034 inferior_debug (5, _(" (signal %d: %s)\n"),
1035 thread
->event
.ex_data
[1],
1036 gdb_signal_to_name (status
->sig ()));
1038 /* If the thread is stopped because it has received a signal
1039 that gdb has just sent, continue. */
1040 if (thread
->signaled
)
1042 thread
->signaled
= 0;
1043 darwin_send_reply (inf
, thread
);
1044 thread
->msg_state
= DARWIN_RUNNING
;
1045 status
->set_ignore ();
1049 status
->set_stopped (GDB_EXC_SOFTWARE
);
1051 case EXC_BREAKPOINT
:
1052 /* Many internal GDB routines expect breakpoints to be reported
1053 as GDB_SIGNAL_TRAP, and will report GDB_EXC_BREAKPOINT
1054 as a spurious signal. */
1055 status
->set_stopped (GDB_SIGNAL_TRAP
);
1058 status
->set_stopped (GDB_SIGNAL_UNKNOWN
);
1062 return ptid_t (inf
->pid
, 0, thread
->gdb_port
);
1064 else if (hdr
->msgh_id
== 0x48)
1066 /* MACH_NOTIFY_DEAD_NAME: notification for exit *or* WIFSTOPPED. */
1069 res
= darwin_decode_notify_message (hdr
, &inf
);
1073 /* Should not happen... */
1075 (_("darwin_wait: ill-formatted message (id=0x%x, res=%d)\n"),
1082 if (res
< 0 || inf
== NULL
)
1084 status
->set_ignore ();
1085 return minus_one_ptid
;
1090 darwin_inferior
*priv
= get_darwin_inferior (inf
);
1092 if (!priv
->no_ptrace
)
1097 res_pid
= wait4 (inf
->pid
, &wstatus
, 0, NULL
);
1098 if (res_pid
< 0 || res_pid
!= inf
->pid
)
1100 warning (_("wait4: res=%d: %s\n"),
1101 res_pid
, safe_strerror (errno
));
1102 status
->set_ignore ();
1103 return minus_one_ptid
;
1105 if (WIFEXITED (wstatus
))
1107 status
->set_exited (WEXITSTATUS (wstatus
));
1108 inferior_debug (4, _("darwin_wait: pid=%d exit, status=0x%x\n"),
1111 else if (WIFSTOPPED (wstatus
))
1113 /* Ignore stopped state, it will be handled by the next
1115 status
->set_ignore ();
1116 inferior_debug (4, _("darwin_wait: pid %d received WIFSTOPPED\n"),
1118 return minus_one_ptid
;
1120 else if (WIFSIGNALED (wstatus
))
1122 status
->set_signalled
1123 (gdb_signal_from_host (WTERMSIG (wstatus
)));
1124 inferior_debug (4, _("darwin_wait: pid=%d received signal %d\n"),
1125 res_pid
, status
->sig());
1129 status
->set_ignore ();
1130 warning (_("Unexpected wait status after MACH_NOTIFY_DEAD_NAME "
1131 "notification: 0x%x"), wstatus
);
1132 return minus_one_ptid
;
1135 return ptid_t (inf
->pid
);
1139 inferior_debug (4, _("darwin_wait: pid=%d\n"), inf
->pid
);
1140 status
->set_exited (0 /* Don't know. */);
1141 return ptid_t (inf
->pid
, 0, 0);
1146 /* Unknown message. */
1147 warning (_("darwin: got unknown message, id: 0x%x"), hdr
->msgh_id
);
1148 status
->set_ignore ();
1149 return minus_one_ptid
;
1153 darwin_nat_target::cancel_breakpoint (ptid_t ptid
)
1155 /* Arrange for a breakpoint to be hit again later. We will handle
1156 the current event, eventually we will resume this thread, and this
1157 breakpoint will trap again.
1159 If we do not do this, then we run the risk that the user will
1160 delete or disable the breakpoint, but the thread will have already
1163 struct regcache
*regcache
= get_thread_regcache (this, ptid
);
1164 struct gdbarch
*gdbarch
= regcache
->arch ();
1167 pc
= regcache_read_pc (regcache
) - gdbarch_decr_pc_after_break (gdbarch
);
1168 if (breakpoint_inserted_here_p (regcache
->aspace (), pc
))
1170 inferior_debug (4, "cancel_breakpoint for thread 0x%lx\n",
1171 (unsigned long) ptid
.tid ());
1173 /* Back up the PC if necessary. */
1174 if (gdbarch_decr_pc_after_break (gdbarch
))
1175 regcache_write_pc (regcache
, pc
);
1183 darwin_nat_target::wait_1 (ptid_t ptid
, struct target_waitstatus
*status
)
1188 mach_msg_header_t hdr
;
1191 mach_msg_header_t
*hdr
= &msgin
.hdr
;
1193 darwin_thread_t
*thread
;
1196 (2, _("darwin_wait: waiting for a message ptid=%s\n"),
1197 ptid
.to_string ().c_str ());
1199 /* Handle fake stop events at first. */
1200 if (darwin_inf_fake_stop
!= NULL
)
1202 inferior
*inf
= darwin_inf_fake_stop
;
1203 darwin_inf_fake_stop
= NULL
;
1205 darwin_inferior
*priv
= get_darwin_inferior (inf
);
1207 status
->set_stopped (GDB_SIGNAL_TRAP
);
1208 thread
= priv
->threads
[0];
1209 thread
->msg_state
= DARWIN_STOPPED
;
1210 return ptid_t (inf
->pid
, 0, thread
->gdb_port
);
1215 /* set_sigint_trap (); */
1217 /* Wait for a message. */
1218 kret
= mach_msg (&msgin
.hdr
, MACH_RCV_MSG
| MACH_RCV_INTERRUPT
, 0,
1219 sizeof (msgin
.data
), darwin_port_set
, 0, MACH_PORT_NULL
);
1221 /* clear_sigint_trap (); */
1223 if (kret
== MACH_RCV_INTERRUPTED
)
1225 status
->set_ignore ();
1226 return minus_one_ptid
;
1229 if (kret
!= MACH_MSG_SUCCESS
)
1231 inferior_debug (5, _("mach_msg: ret=0x%x\n"), kret
);
1232 status
->set_spurious ();
1233 return minus_one_ptid
;
1236 /* Debug: display message. */
1237 if (darwin_debug_flag
> 10)
1238 darwin_dump_message (hdr
, darwin_debug_flag
> 11);
1241 res
= decode_message (hdr
, &thread
, &inf
, status
);
1242 if (res
== minus_one_ptid
)
1245 /* Early return in case an inferior has exited. */
1249 while (status
->kind () == TARGET_WAITKIND_IGNORE
);
1251 /* Stop all tasks. */
1252 for (inferior
*inf
: all_inferiors (this))
1254 darwin_suspend_inferior (inf
);
1255 check_new_threads (inf
);
1258 /* Read pending messages. */
1261 struct target_waitstatus status2
;
1264 kret
= mach_msg (&msgin
.hdr
,
1265 MACH_RCV_MSG
| MACH_RCV_TIMEOUT
, 0,
1266 sizeof (msgin
.data
), darwin_port_set
, 1, MACH_PORT_NULL
);
1268 if (kret
== MACH_RCV_TIMED_OUT
)
1270 if (kret
!= MACH_MSG_SUCCESS
)
1273 (5, _("darwin_wait: mach_msg(pending) ret=0x%x\n"), kret
);
1277 /* Debug: display message. */
1278 if (darwin_debug_flag
> 10)
1279 darwin_dump_message (hdr
, darwin_debug_flag
> 11);
1282 ptid2
= decode_message (hdr
, &thread
, &inf
, &status2
);
1284 if (inf
!= NULL
&& thread
!= NULL
1285 && thread
->event
.ex_type
== EXC_BREAKPOINT
)
1287 if (thread
->single_step
1288 || cancel_breakpoint (ptid_t (inf
->pid
, 0, thread
->gdb_port
)))
1290 gdb_assert (thread
->msg_state
== DARWIN_MESSAGE
);
1291 darwin_send_reply (inf
, thread
);
1292 thread
->msg_state
= DARWIN_RUNNING
;
1296 (3, _("darwin_wait: thread 0x%x hit a non-gdb breakpoint\n"),
1300 inferior_debug (3, _("darwin_wait: unhandled pending message\n"));
1306 darwin_nat_target::wait (ptid_t ptid
, struct target_waitstatus
*status
,
1307 target_wait_flags options
)
1309 return wait_1 (ptid
, status
);
1313 darwin_nat_target::interrupt ()
1315 struct inferior
*inf
= current_inferior ();
1316 darwin_inferior
*priv
= get_darwin_inferior (inf
);
1318 /* FIXME: handle in no_ptrace mode. */
1319 gdb_assert (!priv
->no_ptrace
);
1320 ::kill (inf
->pid
, SIGINT
);
1323 /* Deallocate threads port and vector. */
1326 darwin_deallocate_threads (struct inferior
*inf
)
1328 darwin_inferior
*priv
= get_darwin_inferior (inf
);
1330 for (darwin_thread_t
*t
: priv
->threads
)
1332 kern_return_t kret
= mach_port_deallocate (gdb_task
, t
->gdb_port
);
1333 MACH_CHECK_ERROR (kret
);
1336 priv
->threads
.clear ();
1340 darwin_nat_target::mourn_inferior ()
1342 struct inferior
*inf
= current_inferior ();
1343 darwin_inferior
*priv
= get_darwin_inferior (inf
);
1347 /* Deallocate threads. */
1348 darwin_deallocate_threads (inf
);
1350 /* Remove notify_port from darwin_port_set. */
1351 kret
= mach_port_move_member (gdb_task
,
1352 priv
->notify_port
, MACH_PORT_NULL
);
1353 MACH_CHECK_ERROR (kret
);
1355 /* Remove task port dead_name notification. */
1356 kret
= mach_port_request_notification (gdb_task
, priv
->task
,
1357 MACH_NOTIFY_DEAD_NAME
, 0,
1359 MACH_MSG_TYPE_MAKE_SEND_ONCE
,
1361 /* This can fail if the task is dead. */
1362 inferior_debug (4, "task=0x%x, prev=0x%x, notify_port=0x%x\n",
1363 priv
->task
, prev
, priv
->notify_port
);
1365 if (kret
== KERN_SUCCESS
)
1367 kret
= mach_port_deallocate (gdb_task
, prev
);
1368 MACH_CHECK_ERROR (kret
);
1371 /* Destroy notify_port. */
1372 kret
= mach_port_destroy (gdb_task
, priv
->notify_port
);
1373 MACH_CHECK_ERROR (kret
);
1375 /* Deallocate saved exception ports. */
1376 darwin_deallocate_exception_ports (priv
);
1378 /* Deallocate task port. */
1379 kret
= mach_port_deallocate (gdb_task
, priv
->task
);
1380 MACH_CHECK_ERROR (kret
);
1384 inf_child_target::mourn_inferior ();
1388 darwin_reply_to_all_pending_messages (struct inferior
*inf
)
1390 darwin_inferior
*priv
= get_darwin_inferior (inf
);
1392 for (darwin_thread_t
*t
: priv
->threads
)
1394 if (t
->msg_state
== DARWIN_MESSAGE
)
1395 darwin_resume_thread (inf
, t
, 0, 0);
1400 darwin_nat_target::stop_inferior (inferior
*inf
)
1402 struct target_waitstatus wstatus
;
1405 darwin_inferior
*priv
= get_darwin_inferior (inf
);
1407 gdb_assert (inf
!= NULL
);
1409 darwin_suspend_inferior (inf
);
1411 darwin_reply_to_all_pending_messages (inf
);
1413 if (priv
->no_ptrace
)
1416 res
= ::kill (inf
->pid
, SIGSTOP
);
1418 warning (_("cannot kill: %s"), safe_strerror (errno
));
1420 /* Wait until the process is really stopped. */
1423 ptid
= wait_1 (ptid_t (inf
->pid
), &wstatus
);
1424 if (wstatus
.kind () == TARGET_WAITKIND_STOPPED
1425 && wstatus
.sig () == GDB_SIGNAL_STOP
)
1430 static kern_return_t
1431 darwin_save_exception_ports (darwin_inferior
*inf
)
1435 inf
->exception_info
.count
=
1436 sizeof (inf
->exception_info
.ports
) / sizeof (inf
->exception_info
.ports
[0]);
1438 kret
= task_get_exception_ports
1439 (inf
->task
, EXC_MASK_ALL
, inf
->exception_info
.masks
,
1440 &inf
->exception_info
.count
, inf
->exception_info
.ports
,
1441 inf
->exception_info
.behaviors
, inf
->exception_info
.flavors
);
1445 static kern_return_t
1446 darwin_restore_exception_ports (darwin_inferior
*inf
)
1451 for (i
= 0; i
< inf
->exception_info
.count
; i
++)
1453 kret
= task_set_exception_ports
1454 (inf
->task
, inf
->exception_info
.masks
[i
], inf
->exception_info
.ports
[i
],
1455 inf
->exception_info
.behaviors
[i
], inf
->exception_info
.flavors
[i
]);
1456 if (kret
!= KERN_SUCCESS
)
1460 return KERN_SUCCESS
;
1463 /* Deallocate saved exception ports. */
1466 darwin_deallocate_exception_ports (darwin_inferior
*inf
)
1471 for (i
= 0; i
< inf
->exception_info
.count
; i
++)
1473 kret
= mach_port_deallocate (gdb_task
, inf
->exception_info
.ports
[i
]);
1474 MACH_CHECK_ERROR (kret
);
1476 inf
->exception_info
.count
= 0;
1480 darwin_setup_exceptions (struct inferior
*inf
)
1482 darwin_inferior
*priv
= get_darwin_inferior (inf
);
1484 exception_mask_t mask
;
1486 kret
= darwin_save_exception_ports (priv
);
1487 if (kret
!= KERN_SUCCESS
)
1488 error (_("Unable to save exception ports, task_get_exception_ports"
1492 /* Set exception port. */
1493 if (enable_mach_exceptions
)
1494 mask
= EXC_MASK_ALL
;
1496 mask
= EXC_MASK_SOFTWARE
| EXC_MASK_BREAKPOINT
;
1497 kret
= task_set_exception_ports (priv
->task
, mask
, darwin_ex_port
,
1498 EXCEPTION_DEFAULT
, THREAD_STATE_NONE
);
1499 if (kret
!= KERN_SUCCESS
)
1500 error (_("Unable to set exception ports, task_set_exception_ports"
1506 darwin_nat_target::kill ()
1508 struct inferior
*inf
= current_inferior ();
1509 darwin_inferior
*priv
= get_darwin_inferior (inf
);
1510 struct target_waitstatus wstatus
;
1515 if (inferior_ptid
== null_ptid
)
1518 gdb_assert (inf
!= NULL
);
1520 kret
= darwin_restore_exception_ports (priv
);
1521 MACH_CHECK_ERROR (kret
);
1523 darwin_reply_to_all_pending_messages (inf
);
1525 res
= ::kill (inf
->pid
, 9);
1529 /* On MacOS version Sierra, the darwin_restore_exception_ports call
1530 does not work as expected.
1531 When the kill function is called, the SIGKILL signal is received
1532 by gdb whereas it should have been received by the kernel since
1533 the exception ports have been restored.
1534 This behavior is not the expected one thus gdb does not reply to
1535 the received SIGKILL message. This situation leads to a "busy"
1536 resource from the kernel point of view and the inferior is never
1537 released, causing it to remain as a zombie process, even after
1539 To work around this, we mark all the threads of the inferior as
1540 signaled thus darwin_decode_message function knows that the kill
1541 signal was sent by gdb and will take the appropriate action
1542 (cancel signal and reply to the signal message). */
1543 for (darwin_thread_t
*thread
: priv
->threads
)
1544 thread
->signaled
= 1;
1546 darwin_resume_inferior (inf
);
1548 ptid
= wait_1 (ptid_t (inf
->pid
), &wstatus
);
1550 else if (errno
!= ESRCH
)
1551 warning (_("Failed to kill inferior: kill (%d, 9) returned [%s]"),
1552 inf
->pid
, safe_strerror (errno
));
1554 target_mourn_inferior (ptid_t (inf
->pid
));
1558 darwin_setup_request_notification (struct inferior
*inf
)
1560 darwin_inferior
*priv
= get_darwin_inferior (inf
);
1562 mach_port_t prev_not
;
1564 kret
= mach_port_request_notification (gdb_task
, priv
->task
,
1565 MACH_NOTIFY_DEAD_NAME
, 0,
1567 MACH_MSG_TYPE_MAKE_SEND_ONCE
,
1569 if (kret
!= KERN_SUCCESS
)
1570 error (_("Termination notification request failed, "
1571 "mach_port_request_notification\n"
1574 if (prev_not
!= MACH_PORT_NULL
)
1576 /* This is unexpected, as there should not be any previously
1577 registered notification request. But this is not a fatal
1578 issue, so just emit a warning. */
1580 A task termination request was registered before the debugger registered\n\
1581 its own. This is unexpected, but should otherwise not have any actual\n\
1582 impact on the debugging session."));
1587 darwin_attach_pid (struct inferior
*inf
)
1591 darwin_inferior
*priv
= new darwin_inferior
;
1592 inf
->priv
.reset (priv
);
1596 kret
= task_for_pid (gdb_task
, inf
->pid
, &priv
->task
);
1597 if (kret
!= KERN_SUCCESS
)
1601 if (!inf
->attach_flag
)
1604 waitpid (inf
->pid
, &status
, 0);
1608 (_("Unable to find Mach task port for process-id %d: %s (0x%lx).\n"
1609 " (please check gdb is codesigned - see taskgated(8))"),
1610 inf
->pid
, mach_error_string (kret
), (unsigned long) kret
);
1613 inferior_debug (2, _("inferior task: 0x%x, pid: %d\n"),
1614 priv
->task
, inf
->pid
);
1616 if (darwin_ex_port
== MACH_PORT_NULL
)
1618 /* Create a port to get exceptions. */
1619 kret
= mach_port_allocate (gdb_task
, MACH_PORT_RIGHT_RECEIVE
,
1621 if (kret
!= KERN_SUCCESS
)
1622 error (_("Unable to create exception port, mach_port_allocate "
1626 kret
= mach_port_insert_right (gdb_task
, darwin_ex_port
,
1628 MACH_MSG_TYPE_MAKE_SEND
);
1629 if (kret
!= KERN_SUCCESS
)
1630 error (_("Unable to create exception port, mach_port_insert_right "
1634 /* Create a port set and put ex_port in it. */
1635 kret
= mach_port_allocate (gdb_task
, MACH_PORT_RIGHT_PORT_SET
,
1637 if (kret
!= KERN_SUCCESS
)
1638 error (_("Unable to create port set, mach_port_allocate "
1642 kret
= mach_port_move_member (gdb_task
, darwin_ex_port
,
1644 if (kret
!= KERN_SUCCESS
)
1645 error (_("Unable to move exception port into new port set, "
1646 "mach_port_move_member\n"
1651 /* Create a port to be notified when the child task terminates. */
1652 kret
= mach_port_allocate (gdb_task
, MACH_PORT_RIGHT_RECEIVE
,
1653 &priv
->notify_port
);
1654 if (kret
!= KERN_SUCCESS
)
1655 error (_("Unable to create notification port, mach_port_allocate "
1659 kret
= mach_port_move_member (gdb_task
,
1660 priv
->notify_port
, darwin_port_set
);
1661 if (kret
!= KERN_SUCCESS
)
1662 error (_("Unable to move notification port into new port set, "
1663 "mach_port_move_member\n"
1667 darwin_setup_request_notification (inf
);
1669 darwin_setup_exceptions (inf
);
1671 catch (const gdb_exception
&ex
)
1673 exit_inferior (inf
);
1674 switch_to_no_thread ();
1679 target_ops
*darwin_ops
= get_native_target ();
1680 if (!inf
->target_is_pushed (darwin_ops
))
1681 inf
->push_target (darwin_ops
);
1684 /* Get the thread_info object corresponding to this darwin_thread_info. */
1686 static struct thread_info
*
1687 thread_info_from_private_thread_info (darwin_thread_info
*pti
)
1689 for (struct thread_info
*it
: all_threads ())
1691 darwin_thread_info
*iter_pti
= get_darwin_thread_info (it
);
1693 if (iter_pti
->gdb_port
== pti
->gdb_port
)
1697 gdb_assert_not_reached ("did not find gdb thread for darwin thread");
1701 darwin_nat_target::init_thread_list (inferior
*inf
)
1703 check_new_threads (inf
);
1705 darwin_inferior
*priv
= get_darwin_inferior (inf
);
1707 gdb_assert (!priv
->threads
.empty ());
1709 darwin_thread_info
*first_pti
= priv
->threads
.front ();
1710 struct thread_info
*first_thread
1711 = thread_info_from_private_thread_info (first_pti
);
1713 switch_to_thread (first_thread
);
1716 /* The child must synchronize with gdb: gdb must set the exception port
1717 before the child call PTRACE_SIGEXC. We use a pipe to achieve this.
1718 FIXME: is there a lighter way ? */
1719 static int ptrace_fds
[2];
1722 darwin_ptrace_me (void)
1727 /* Close write end point. */
1728 if (close (ptrace_fds
[1]) < 0)
1729 trace_start_error_with_name ("close");
1731 /* Wait until gdb is ready. */
1732 res
= read (ptrace_fds
[0], &c
, 1);
1734 trace_start_error (_("unable to read from pipe, read returned: %d"), res
);
1736 if (close (ptrace_fds
[0]) < 0)
1737 trace_start_error_with_name ("close");
1739 /* Get rid of privileges. */
1740 if (setegid (getgid ()) < 0)
1741 trace_start_error_with_name ("setegid");
1744 if (PTRACE (PT_TRACE_ME
, 0, 0, 0) < 0)
1745 trace_start_error_with_name ("PTRACE");
1747 /* Redirect signals to exception port. */
1748 if (PTRACE (PT_SIGEXC
, 0, 0, 0) < 0)
1749 trace_start_error_with_name ("PTRACE");
1752 /* Dummy function to be sure fork_inferior uses fork(2) and not vfork(2). */
1754 darwin_pre_ptrace (void)
1756 if (pipe (ptrace_fds
) != 0)
1760 error (_("unable to create a pipe: %s"), safe_strerror (errno
));
1763 mark_fd_no_cloexec (ptrace_fds
[0]);
1764 mark_fd_no_cloexec (ptrace_fds
[1]);
1768 darwin_nat_target::ptrace_him (int pid
)
1770 struct inferior
*inf
= current_inferior ();
1772 darwin_attach_pid (inf
);
1774 /* Let's the child run. */
1775 ::close (ptrace_fds
[0]);
1776 ::close (ptrace_fds
[1]);
1778 unmark_fd_no_cloexec (ptrace_fds
[0]);
1779 unmark_fd_no_cloexec (ptrace_fds
[1]);
1781 init_thread_list (inf
);
1783 gdb_startup_inferior (pid
, START_INFERIOR_TRAPS_EXPECTED
);
1787 darwin_execvp (const char *file
, char * const argv
[], char * const env
[])
1789 posix_spawnattr_t attr
;
1793 res
= posix_spawnattr_init (&attr
);
1797 (gdb_stderr
, "Cannot initialize attribute for posix_spawn\n");
1801 /* Do like execve: replace the image. */
1802 ps_flags
= POSIX_SPAWN_SETEXEC
;
1804 /* Disable ASLR. The constant doesn't look to be available outside the
1805 kernel include files. */
1806 #ifndef _POSIX_SPAWN_DISABLE_ASLR
1807 #define _POSIX_SPAWN_DISABLE_ASLR 0x0100
1809 ps_flags
|= _POSIX_SPAWN_DISABLE_ASLR
;
1810 res
= posix_spawnattr_setflags (&attr
, ps_flags
);
1813 gdb_printf (gdb_stderr
, "Cannot set posix_spawn flags\n");
1817 posix_spawnp (NULL
, argv
[0], NULL
, &attr
, argv
, env
);
1820 /* Read kernel version, and return TRUE if this host may have System
1821 Integrity Protection (Sierra or later). */
1827 size_t sz
= sizeof (str
);
1830 ret
= sysctlbyname ("kern.osrelease", str
, &sz
, NULL
, 0);
1831 if (ret
== 0 && sz
< sizeof (str
))
1833 unsigned long ver
= strtoul (str
, NULL
, 10);
1840 /* A helper for maybe_cache_shell. This copies the shell to the
1841 cache. It will throw an exception on any failure. */
1844 copy_shell_to_cache (const char *shell
, const std::string
&new_name
)
1846 scoped_fd from_fd
= gdb_open_cloexec (shell
, O_RDONLY
, 0);
1847 if (from_fd
.get () < 0)
1848 error (_("Could not open shell (%s) for reading: %s"),
1849 shell
, safe_strerror (errno
));
1851 std::string new_dir
= ldirname (new_name
.c_str ());
1852 if (!mkdir_recursive (new_dir
.c_str ()))
1853 error (_("Could not make cache directory \"%s\": %s"),
1854 new_dir
.c_str (), safe_strerror (errno
));
1856 gdb::char_vector temp_name
= make_temp_filename (new_name
);
1857 scoped_fd to_fd
= gdb_mkostemp_cloexec (&temp_name
[0]);
1858 gdb::unlinker
unlink_file_on_error (temp_name
.data ());
1860 if (to_fd
.get () < 0)
1861 error (_("Could not open temporary file \"%s\" for writing: %s"),
1862 temp_name
.data (), safe_strerror (errno
));
1864 if (fcopyfile (from_fd
.get (), to_fd
.get (), nullptr,
1865 COPYFILE_STAT
| COPYFILE_DATA
) != 0)
1866 error (_("Could not copy shell to cache as \"%s\": %s"),
1867 temp_name
.data (), safe_strerror (errno
));
1869 /* Be sure that the caching is atomic so that we don't get bad
1870 results from multiple copies of gdb running at the same time. */
1871 if (rename (temp_name
.data (), new_name
.c_str ()) != 0)
1872 error (_("Could not rename shell cache file to \"%s\": %s"),
1873 new_name
.c_str (), safe_strerror (errno
));
1875 unlink_file_on_error
.keep ();
1878 /* If $SHELL is restricted, try to cache a copy. Starting with El
1879 Capitan, macOS introduced System Integrity Protection. Among other
1880 things, this prevents certain executables from being ptrace'd. In
1881 particular, executables in /bin, like most shells, are affected.
1882 To work around this, while preserving command-line glob expansion
1883 and redirections, gdb will cache a copy of the shell. Return true
1884 if all is well -- either the shell is not subject to SIP or it has
1885 been successfully cached. Returns false if something failed. */
1888 maybe_cache_shell ()
1890 /* SF_RESTRICTED is defined in sys/stat.h and lets us determine if a
1891 given file is subject to SIP. */
1892 #ifdef SF_RESTRICTED
1894 /* If a check fails we want to revert -- maybe the user deleted the
1895 cache while gdb was running, or something like that. */
1896 copied_shell
= nullptr;
1898 const char *shell
= get_shell ();
1899 if (!IS_ABSOLUTE_PATH (shell
))
1901 warning (_("This version of macOS has System Integrity Protection.\n\
1902 Normally gdb would try to work around this by caching a copy of your shell,\n\
1903 but because your shell (%s) is not an absolute path, this is being skipped."),
1909 if (stat (shell
, &sb
) < 0)
1911 warning (_("This version of macOS has System Integrity Protection.\n\
1912 Normally gdb would try to work around this by caching a copy of your shell,\n\
1913 but because gdb could not stat your shell (%s), this is being skipped.\n\
1914 The error was: %s"),
1915 shell
, safe_strerror (errno
));
1919 if ((sb
.st_flags
& SF_RESTRICTED
) == 0)
1922 /* Put the copy somewhere like ~/Library/Caches/gdb/bin/sh. */
1923 std::string new_name
= get_standard_cache_dir ();
1924 /* There's no need to insert a directory separator here, because
1925 SHELL is known to be absolute. */
1926 new_name
.append (shell
);
1928 /* Maybe it was cached by some earlier gdb. */
1929 if (stat (new_name
.c_str (), &sb
) != 0 || !S_ISREG (sb
.st_mode
))
1933 copy_shell_to_cache (shell
, new_name
);
1935 catch (const gdb_exception_error
&ex
)
1937 warning (_("This version of macOS has System Integrity Protection.\n\
1938 Because `startup-with-shell' is enabled, gdb tried to work around SIP by\n\
1939 caching a copy of your shell. However, this failed:\n\
1941 If you correct the problem, gdb will automatically try again the next time\n\
1942 you \"run\". To prevent these attempts, you can use:\n\
1943 set startup-with-shell off"),
1948 gdb_printf (_("Note: this version of macOS has System Integrity Protection.\n\
1949 Because `startup-with-shell' is enabled, gdb has worked around this by\n\
1950 caching a copy of your shell. The shell used by \"run\" is now:\n\
1955 /* We need to make sure that the new name has the correct lifetime. */
1956 static std::string saved_shell
= std::move (new_name
);
1957 copied_shell
= saved_shell
.c_str ();
1959 #endif /* SF_RESTRICTED */
1965 darwin_nat_target::create_inferior (const char *exec_file
,
1966 const std::string
&allargs
,
1967 char **env
, int from_tty
)
1969 gdb::optional
<scoped_restore_tmpl
<bool>> restore_startup_with_shell
;
1970 darwin_nat_target
*the_target
= this;
1972 if (startup_with_shell
&& may_have_sip ())
1974 if (!maybe_cache_shell ())
1976 warning (_("startup-with-shell is now temporarily disabled"));
1977 restore_startup_with_shell
.emplace (&startup_with_shell
, 0);
1981 /* Do the hard work. */
1982 fork_inferior (exec_file
, allargs
, env
, darwin_ptrace_me
,
1983 [the_target
] (int pid
)
1985 the_target
->ptrace_him (pid
);
1987 darwin_pre_ptrace
, copied_shell
,
1992 /* Set things up such that the next call to darwin_wait will immediately
1993 return a fake stop event for inferior INF.
1995 This assumes that the inferior's thread list has been initialized,
1996 as it will suspend the inferior's first thread. */
1999 darwin_setup_fake_stop_event (struct inferior
*inf
)
2001 darwin_inferior
*priv
= get_darwin_inferior (inf
);
2002 darwin_thread_t
*thread
;
2005 gdb_assert (darwin_inf_fake_stop
== NULL
);
2006 darwin_inf_fake_stop
= inf
;
2008 /* When detecting a fake pending stop event, darwin_wait returns
2009 an event saying that the first thread is in a DARWIN_STOPPED
2010 state. To make that accurate, we need to suspend that thread
2011 as well. Otherwise, we'll try resuming it when resuming the
2012 inferior, and get a warning because the thread's suspend count
2013 is already zero, making the resume request useless. */
2014 thread
= priv
->threads
[0];
2015 kret
= thread_suspend (thread
->gdb_port
);
2016 MACH_CHECK_ERROR (kret
);
2019 /* Attach to process PID, then initialize for debugging it
2020 and wait for the trace-trap that results from attaching. */
2022 darwin_nat_target::attach (const char *args
, int from_tty
)
2025 struct inferior
*inf
;
2027 pid
= parse_pid_to_attach (args
);
2029 if (pid
== getpid ()) /* Trying to masturbate? */
2030 error (_("I refuse to debug myself!"));
2032 target_announce_attach (from_tty
, pid
);
2034 if (pid
== 0 || ::kill (pid
, 0) < 0)
2035 error (_("Can't attach to process %d: %s (%d)"),
2036 pid
, safe_strerror (errno
), errno
);
2038 inf
= current_inferior ();
2039 inferior_appeared (inf
, pid
);
2040 inf
->attach_flag
= true;
2042 darwin_attach_pid (inf
);
2044 darwin_suspend_inferior (inf
);
2046 init_thread_list (inf
);
2048 darwin_inferior
*priv
= get_darwin_inferior (inf
);
2050 darwin_check_osabi (priv
, inferior_ptid
.tid ());
2052 darwin_setup_fake_stop_event (inf
);
2054 priv
->no_ptrace
= 1;
2057 /* Take a program previously attached to and detaches it.
2058 The program resumes execution and will no longer stop
2059 on signals, etc. We'd better not have left any breakpoints
2060 in the program or it'll die when it hits one. For this
2061 to work, it may be necessary for the process to have been
2062 previously attached. It *might* work if the program was
2063 started via fork. */
2066 darwin_nat_target::detach (inferior
*inf
, int from_tty
)
2068 darwin_inferior
*priv
= get_darwin_inferior (inf
);
2072 /* Display message. */
2073 target_announce_detach (from_tty
);
2075 /* If ptrace() is in use, stop the process. */
2076 if (!priv
->no_ptrace
)
2077 stop_inferior (inf
);
2079 kret
= darwin_restore_exception_ports (priv
);
2080 MACH_CHECK_ERROR (kret
);
2082 if (!priv
->no_ptrace
)
2084 res
= PTRACE (PT_DETACH
, inf
->pid
, 0, 0);
2086 warning (_("Unable to detach from process-id %d: %s (%d)"),
2087 inf
->pid
, safe_strerror (errno
), errno
);
2090 darwin_reply_to_all_pending_messages (inf
);
2092 /* When using ptrace, we have just performed a PT_DETACH, which
2093 resumes the inferior. On the other hand, when we are not using
2094 ptrace, we need to resume its execution ourselves. */
2095 if (priv
->no_ptrace
)
2096 darwin_resume_inferior (inf
);
2102 darwin_nat_target::pid_to_str (ptid_t ptid
)
2104 long tid
= ptid
.tid ();
2107 return string_printf (_("Thread 0x%lx of process %u"),
2110 return normal_pid_to_str (ptid
);
2114 darwin_nat_target::thread_alive (ptid_t ptid
)
2119 /* If RDADDR is not NULL, read inferior task's LEN bytes from ADDR and
2120 copy it to RDADDR in gdb's address space.
2121 If WRADDR is not NULL, write gdb's LEN bytes from WRADDR and copy it
2122 to ADDR in inferior task's address space.
2123 Return 0 on failure; number of bytes read / written otherwise. */
2126 darwin_read_write_inferior (task_t task
, CORE_ADDR addr
,
2127 gdb_byte
*rdaddr
, const gdb_byte
*wraddr
,
2131 mach_vm_size_t res_length
= 0;
2133 inferior_debug (8, _("darwin_read_write_inferior(task=0x%x, %s, len=%s)\n"),
2134 task
, core_addr_to_string (addr
), pulongest (length
));
2139 mach_vm_size_t count
;
2141 /* According to target.h(to_xfer_partial), one and only one may be
2143 gdb_assert (wraddr
== NULL
);
2145 kret
= mach_vm_read_overwrite (task
, addr
, length
,
2146 (mach_vm_address_t
) rdaddr
, &count
);
2147 if (kret
!= KERN_SUCCESS
)
2150 (1, _("darwin_read_write_inferior: mach_vm_read failed at %s: %s"),
2151 core_addr_to_string (addr
), mach_error_string (kret
));
2158 gdb_assert (wraddr
!= NULL
);
2162 mach_vm_address_t offset
= addr
& (mach_page_size
- 1);
2163 mach_vm_address_t region_address
= (mach_vm_address_t
) (addr
- offset
);
2164 mach_vm_size_t aligned_length
=
2165 (mach_vm_size_t
) PAGE_ROUND (offset
+ length
);
2166 vm_region_submap_short_info_data_64_t info
;
2167 mach_msg_type_number_t count
= VM_REGION_SUBMAP_SHORT_INFO_COUNT_64
;
2168 natural_t region_depth
= 1000;
2169 mach_vm_address_t region_start
= region_address
;
2170 mach_vm_size_t region_length
;
2171 mach_vm_size_t write_length
;
2173 /* Read page protection. */
2174 kret
= mach_vm_region_recurse
2175 (task
, ®ion_start
, ®ion_length
, ®ion_depth
,
2176 (vm_region_recurse_info_t
) &info
, &count
);
2178 if (kret
!= KERN_SUCCESS
)
2180 inferior_debug (1, _("darwin_read_write_inferior: "
2181 "mach_vm_region_recurse failed at %s: %s\n"),
2182 core_addr_to_string (region_address
),
2183 mach_error_string (kret
));
2188 (9, _("darwin_read_write_inferior: "
2189 "mach_vm_region_recurse addr=%s, start=%s, len=%s\n"),
2190 core_addr_to_string (region_address
),
2191 core_addr_to_string (region_start
),
2192 core_addr_to_string (region_length
));
2194 /* Check for holes in memory. */
2195 if (region_start
> region_address
)
2197 warning (_("No memory at %s (vs %s+0x%x). Nothing written"),
2198 core_addr_to_string (region_address
),
2199 core_addr_to_string (region_start
),
2200 (unsigned)region_length
);
2204 /* Adjust the length. */
2205 region_length
-= (region_address
- region_start
);
2206 if (region_length
> aligned_length
)
2207 region_length
= aligned_length
;
2209 /* Make the pages RW. */
2210 if (!(info
.protection
& VM_PROT_WRITE
))
2212 vm_prot_t prot
= VM_PROT_READ
| VM_PROT_WRITE
;
2214 kret
= mach_vm_protect (task
, region_address
, region_length
,
2216 if (kret
!= KERN_SUCCESS
)
2218 prot
|= VM_PROT_COPY
;
2219 kret
= mach_vm_protect (task
, region_address
, region_length
,
2222 if (kret
!= KERN_SUCCESS
)
2224 warning (_("darwin_read_write_inferior: "
2225 "mach_vm_protect failed at %s "
2226 "(len=0x%lx, prot=0x%x): %s"),
2227 core_addr_to_string (region_address
),
2228 (unsigned long) region_length
, (unsigned) prot
,
2229 mach_error_string (kret
));
2234 if (offset
+ length
> region_length
)
2235 write_length
= region_length
- offset
;
2237 write_length
= length
;
2240 kret
= mach_vm_write (task
, addr
, (vm_offset_t
) wraddr
, write_length
);
2241 if (kret
!= KERN_SUCCESS
)
2243 warning (_("darwin_read_write_inferior: mach_vm_write failed: %s"),
2244 mach_error_string (kret
));
2248 /* Restore page rights. */
2249 if (!(info
.protection
& VM_PROT_WRITE
))
2251 kret
= mach_vm_protect (task
, region_address
, region_length
,
2252 FALSE
, info
.protection
);
2253 if (kret
!= KERN_SUCCESS
)
2255 warning (_("darwin_read_write_inferior: "
2256 "mach_vm_protect restore failed at %s "
2258 core_addr_to_string (region_address
),
2259 (unsigned long) region_length
,
2260 mach_error_string (kret
));
2264 addr
+= write_length
;
2265 wraddr
+= write_length
;
2266 res_length
+= write_length
;
2267 length
-= write_length
;
2273 /* Read LENGTH bytes at offset ADDR of task_dyld_info for TASK, and copy them
2274 to RDADDR (in big endian).
2275 Return 0 on failure; number of bytes read / written otherwise. */
2277 #ifdef TASK_DYLD_INFO_COUNT
2278 /* This is not available in Darwin 9. */
2279 static enum target_xfer_status
2280 darwin_read_dyld_info (task_t task
, CORE_ADDR addr
, gdb_byte
*rdaddr
,
2281 ULONGEST length
, ULONGEST
*xfered_len
)
2283 struct task_dyld_info task_dyld_info
;
2284 mach_msg_type_number_t count
= TASK_DYLD_INFO_COUNT
;
2287 if (addr
!= 0 || length
> sizeof (mach_vm_address_t
))
2288 return TARGET_XFER_EOF
;
2290 kret
= task_info (task
, TASK_DYLD_INFO
,
2291 (task_info_t
) &task_dyld_info
, &count
);
2292 MACH_CHECK_ERROR (kret
);
2293 if (kret
!= KERN_SUCCESS
)
2294 return TARGET_XFER_E_IO
;
2296 store_unsigned_integer (rdaddr
, length
, BFD_ENDIAN_BIG
,
2297 task_dyld_info
.all_image_info_addr
);
2298 *xfered_len
= (ULONGEST
) length
;
2299 return TARGET_XFER_OK
;
2305 enum target_xfer_status
2306 darwin_nat_target::xfer_partial (enum target_object object
, const char *annex
,
2307 gdb_byte
*readbuf
, const gdb_byte
*writebuf
,
2308 ULONGEST offset
, ULONGEST len
,
2309 ULONGEST
*xfered_len
)
2311 struct inferior
*inf
= current_inferior ();
2312 darwin_inferior
*priv
= get_darwin_inferior (inf
);
2315 (8, _("darwin_xfer_partial(%s, %s, rbuf=%s, wbuf=%s) pid=%u\n"),
2316 core_addr_to_string (offset
), pulongest (len
),
2317 host_address_to_string (readbuf
), host_address_to_string (writebuf
),
2322 case TARGET_OBJECT_MEMORY
:
2324 int l
= darwin_read_write_inferior (priv
->task
, offset
,
2325 readbuf
, writebuf
, len
);
2328 return TARGET_XFER_EOF
;
2332 *xfered_len
= (ULONGEST
) l
;
2333 return TARGET_XFER_OK
;
2336 #ifdef TASK_DYLD_INFO_COUNT
2337 case TARGET_OBJECT_DARWIN_DYLD_INFO
:
2338 if (writebuf
!= NULL
|| readbuf
== NULL
)
2340 /* Support only read. */
2341 return TARGET_XFER_E_IO
;
2343 return darwin_read_dyld_info (priv
->task
, offset
, readbuf
, len
,
2347 return TARGET_XFER_E_IO
;
2353 set_enable_mach_exceptions (const char *args
, int from_tty
,
2354 struct cmd_list_element
*c
)
2356 if (inferior_ptid
!= null_ptid
)
2358 struct inferior
*inf
= current_inferior ();
2359 darwin_inferior
*priv
= get_darwin_inferior (inf
);
2360 exception_mask_t mask
;
2363 if (enable_mach_exceptions
)
2364 mask
= EXC_MASK_ALL
;
2367 darwin_restore_exception_ports (priv
);
2368 mask
= EXC_MASK_SOFTWARE
| EXC_MASK_BREAKPOINT
;
2370 kret
= task_set_exception_ports (priv
->task
, mask
, darwin_ex_port
,
2371 EXCEPTION_DEFAULT
, THREAD_STATE_NONE
);
2372 MACH_CHECK_ERROR (kret
);
2377 darwin_nat_target::pid_to_exec_file (int pid
)
2379 static char path
[PATH_MAX
];
2382 res
= proc_pidinfo (pid
, PROC_PIDPATHINFO
, 0, path
, PATH_MAX
);
2390 darwin_nat_target::get_ada_task_ptid (long lwp
, ULONGEST thread
)
2392 struct inferior
*inf
= current_inferior ();
2393 darwin_inferior
*priv
= get_darwin_inferior (inf
);
2395 mach_port_name_array_t names
;
2396 mach_msg_type_number_t names_count
;
2397 mach_port_type_array_t types
;
2398 mach_msg_type_number_t types_count
;
2401 /* First linear search. */
2402 for (darwin_thread_t
*t
: priv
->threads
)
2404 if (t
->inf_port
== lwp
)
2405 return ptid_t (inferior_ptid
.pid (), 0, t
->gdb_port
);
2408 /* Maybe the port was never extract. Do it now. */
2410 /* First get inferior port names. */
2411 kret
= mach_port_names (priv
->task
, &names
, &names_count
, &types
,
2413 MACH_CHECK_ERROR (kret
);
2414 if (kret
!= KERN_SUCCESS
)
2417 /* For each name, copy the right in the gdb space and then compare with
2418 our view of the inferior threads. We don't forget to deallocate the
2420 for (int i
= 0; i
< names_count
; i
++)
2422 mach_port_t local_name
;
2423 mach_msg_type_name_t local_type
;
2425 /* We just need to know the corresponding name in gdb name space.
2426 So extract and deallocate the right. */
2427 kret
= mach_port_extract_right (priv
->task
, names
[i
],
2428 MACH_MSG_TYPE_COPY_SEND
,
2429 &local_name
, &local_type
);
2430 if (kret
!= KERN_SUCCESS
)
2432 mach_port_deallocate (gdb_task
, local_name
);
2434 for (darwin_thread_t
*t
: priv
->threads
)
2436 if (t
->gdb_port
== local_name
)
2438 t
->inf_port
= names
[i
];
2439 if (names
[i
] == lwp
)
2445 vm_deallocate (gdb_task
, (vm_address_t
) names
,
2446 names_count
* sizeof (mach_port_t
));
2449 return ptid_t (current_inferior ()->pid
, 0, res
);
2455 darwin_nat_target::supports_multi_process ()
2460 void _initialize_darwin_nat ();
2462 _initialize_darwin_nat ()
2466 gdb_task
= mach_task_self ();
2467 darwin_host_self
= mach_host_self ();
2469 /* Read page size. */
2470 kret
= host_page_size (darwin_host_self
, &mach_page_size
);
2471 if (kret
!= KERN_SUCCESS
)
2473 mach_page_size
= 0x1000;
2474 MACH_CHECK_ERROR (kret
);
2477 inferior_debug (2, _("GDB task: 0x%lx, pid: %d\n"),
2478 (unsigned long) mach_task_self (), getpid ());
2480 add_setshow_zuinteger_cmd ("darwin", class_obscure
,
2481 &darwin_debug_flag
, _("\
2482 Set if printing inferior communication debugging statements."), _("\
2483 Show if printing inferior communication debugging statements."), NULL
,
2485 &setdebuglist
, &showdebuglist
);
2487 add_setshow_boolean_cmd ("mach-exceptions", class_support
,
2488 &enable_mach_exceptions
, _("\
2489 Set if mach exceptions are caught."), _("\
2490 Show if mach exceptions are caught."), _("\
2491 When this mode is on, all low level exceptions are reported before being\n\
2492 reported by the kernel."),
2493 &set_enable_mach_exceptions
, NULL
,
2494 &setlist
, &showlist
);