I am looking at some logs that I collected through sysdiagnose and I notice several messages of the form:
... fault 2025-03-05 01:12:04.034832 +0000 runningboardd Two equal instances have unequal identities. <anon<java>(502) pid=86764 AUID=502> and <anon<java>(502)(0) pid=86764> fault 2025-03-05 01:15:05.829696 +0000 runningboardd Two equal instances have unequal identities. <anon<java>(502) pid=88001 AUID=502> and <anon<java>(502)(0) pid=88001> fault 2025-03-05 01:15:06.047003 +0000 runningboardd Two equal instances have unequal identities. <anon<java>(502) pid=88010 AUID=502> and <anon<java>(502)(0) pid=88010> fault 2025-03-05 01:15:06.385648 +0000 runningboardd Two equal instances have unequal identities. <anon<java>(502) pid=88012 AUID=502> and <anon<java>(502)(0) pid=88012> fault 2025-03-05 01:15:07.135896 +0000 runningboardd Two equal instances have unequal identities. <anon<java>(502) pid=88019 AUID=502> and <anon<java>(502)(0) pid=88019> fault 2025-03-05 01:15:07.491316 +0000 runningboardd Two equal instances have unequal identities. <anon<java>(502) pid=88021 AUID=502> and <anon<java>(502)(0) pid=88021> fault 2025-03-05 01:15:07.542102 +0000 runningboardd Two equal instances have unequal identities. <anon<java>(502) pid=88022 AUID=502> and <anon<java>(502)(0) pid=88022> fault 2025-03-05 01:15:07.803126 +0000 runningboardd Two equal instances have unequal identities. <anon<java>(502) pid=88025 AUID=502> and <anon<java>(502)(0) pid=88025> fault 2025-03-05 01:15:59.774214 +0000 runningboardd Two equal instances have unequal identities. <anon<java>(502) pid=88568 AUID=502> and <anon<java>(502)(0) pid=88568> fault 2025-03-05 01:16:00.142288 +0000 runningboardd Two equal instances have unequal identities. <anon<java>(502) pid=88572 AUID=502> and <anon<java>(502)(0) pid=88572> fault 2025-03-05 01:16:00.224019 +0000 runningboardd Two equal instances have unequal identities. <anon<java>(502) pid=88573 AUID=502> and <anon<java>(502)(0) pid=88573> fault 2025-03-05 01:16:01.180670 +0000 runningboardd Two equal instances have unequal identities. <anon<java>(502) pid=88580 AUID=502> and <anon<java>(502)(0) pid=88580> fault 2025-03-05 01:16:01.879884 +0000 runningboardd Two equal instances have unequal identities. <anon<java>(502) pid=88588 AUID=502> and <anon<java>(502)(0) pid=88588> fault 2025-03-05 01:16:02.233165 +0000 runningboardd Two equal instances have unequal identities. <anon<java>(502) pid=88589 AUID=502> and <anon<java>(502)(0) pid=88589> ...
What's strange is that each of the message seems to say that it has identified two instances with unequal identities and yet it prints the same process for each such message. Notice:
fault 2025-03-05 01:16:02.233165 +0000 runningboardd Two equal instances have unequal identities. <anon<java>(502) pid=88589 AUID=502> and <anon<java>(502)(0) pid=88589>
I suspect the identity it is talking about is the one explained as designated requirement here https://developer.apple.com/documentation/Technotes/tn3127-inside-code-signing-requirements#Designated-requirement. Yet the message isn't clear why the same process would have two different identities. The type of this message is "fault", so I'm guessing that this message is pointing to some genuine issue with the executable of the process. Is that right? Any inputs on what could be wrong here?
This is from a 15.3.1 macosx aarch64 system. On that note, is runningboardd
the process which is responsible for these identity checks?
IMPORTANT The following contains a lot of implementation details. Don’t encode this knowledge into a product that you ship to a wide range of users. It has changed in the past and will likely change again in the future.
Let’s start with the runningboardd
man page. That’s not super helpful, but it does at least tell you that it’s responsible for managing processes. It started on iOS and has since moved to macOS.
That’s not the case. Rather, this is an internal identity used by runningboardd
to classify the processes it knows about based on how they got started. For example, an application process has a description that starts with app
. You can see these littered throughout the system log:
type: default time: 13:12:54.328208+0000 process: runningboardd subsystem: com.apple.runningboard category: monitor message: Calculated state for app<application.com.apple.Console.…(502)>…
There are similar prefixes for DEXTs (dext
), XPC services (xpcservice
), and probably lots of others that I couldn’t find in the logs. However, in your case the prefix is anon
, which indicates a process that runningboardd
knows about but isn’t managing.
On macOS those are easy to generate. For example, if you build this program and run it from Terminal, it’ll get an anon
entry:
import Foundation func main() { var auid = au_id_t() getauid(&auid) print(getuid(), geteuid(), auid) let a = ProcessInfo.processInfo.beginActivity(options: [.idleDisplaySleepDisabled], reason: "test") withExtendedLifetime(a) { usleep(1_000) ProcessInfo.processInfo.endActivity(a) } } main()
That’s because starting the .idleDisplaySleepDisabled
activity has to raise an assertion [1] with runningboardd
, which causes the process to check in with it, whereupon it realises that it doesn’t know anything about this process and allocates it an identity. In the system log you see this:
type: default time: 13:46:06.946686+0000 process: runningboardd subsystem: com.apple.runningboard category: process message: Resolved pid 35518 to [anon<Test776288>(502):35518]
So, let’s look at the two identities for your process, reformatted so that the columns line up:
<anon<java>(502) pid=88589 AUID=502> <anon<java>(502)(0) pid=88589 >
These are obviously the same process, pid 88589, but some details differ. That’s what this log entry is complaining about.
As to how your process got two identities, I’m not 100% sure. The AUID
refers to the audit user ID, that is, the value returned by getauid
. I wasn’t able to determine what the (0)
means.
I suspect that this is due to the weird way that Java apps launch themselves, often involving things like a fork without an exec, or vice versa. However, I played around with various techniques like that and wasn’t able to reproduce it.
I’m inclined to investigate this further, because it’s a sign that Java is straying off the beaten path, and such excursion tend to eventually result in weird issues.
Are you able to reproduce this reliably? If so, it’d be helpful if you could try to isolate what about the Java startup sequence is triggering it.
Share and Enjoy
—
Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"
[1] I’m using assertion in the context defined in UIApplication Background Task Notes.