рдУрдПрд╕ рдПрдХреНрд╕ рдореЗрдВ рдереНрд░реЗрдбреНрд╕: рдПрдХ рд╡рд┐рджреЗрд╢реА рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд╕рднреА рдереНрд░реЗрдбреНрд╕ рдХрд╛ рд╕реАрдкреАрдпреВ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ?

рд╢реБрдн рджреЛрдкрд╣рд░, рдкреНрдпрд╛рд░реЗ рдЦрд╛рдмрд░реЛрд╡рд┐рддреНрд╕-рдордХреЛрд╡рдбреА!

[рдореИрдХ] рдУрдПрд╕ рдПрдХреНрд╕ рдореЗрдВ рдПрдХ рдЕрджреНрднреБрдд рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЯреВрд▓ - рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рдореЙрдирд┐рдЯрд░ рд╣реИ, рдЬреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдФрд░ рд╕реАрдкреАрдпреВ рд╕рдордп рджреНрд╡рд╛рд░рд╛ рдХрдмреНрдЬрд╛ рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рджрд┐рдЦрд╛рддрд╛ рд╣реИред рд╡реИрд╕реЗ, рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдЖрдк рдХреБрдЫ рдЕрдЬреАрдм рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджреЗрдЦреЗрдВ рдХрд┐ рдХрд┐рддрдиреЗ рдзрд╛рдЧреЗ рдореЗрдВ рдзрд╛рдЧреЗ рд╣реИрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдХрд┐рддрдирд╛ рд╕реАрдкреАрдпреВ рдЦрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рдореЙрдирд┐рдЯрд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╣рдорд╛рд░реА рдорджрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЕрдиреБрднрд╡реА рд▓рд┐рдирдХреНрд╕ рдХреЛ рдпрд╣рд╛рдВ рдкрд░ procfs рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ред рд╣рдореЗрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕реНрд╡рдпрдВ рд╣реА рд╣рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЖрдЬ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдХрдВрд╕реЛрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдирд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдХреЗ CPU рдЙрдкрдпреЛрдЧ (рд╕рд╛рде рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ) рдкрд░ рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдкреАрдЖрдИрдбреА тАЛтАЛрд▓реЗрдЧрд╛ред

рд╣рдо рд╢реБрджреНрдз рд╕реА рдореЗрдВ рд▓рд┐рдЦреЗрдВрдЧреЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ рд╣реЛрдЧреА, рдФрд░ рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рдЫреЛрдЯреА рд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП Xcode рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ, рдЗрд╕реЗ рдирд┐рдпрдорд┐рдд рдореЗрдХрдлрд╛рдЗрд▓ рд╣реЛрдиреЗ рджреЗрдВред

рдкрд╣рд▓рд╛, рдереЛрдбрд╝рд╛ рд╕рд┐рджреНрдзрд╛рдВрддред рд╣рдореЗрдВ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реЗ рдПрдХ рддреГрддреАрдп-рдкрдХреНрд╖ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдереНрд░реЗрдбреНрд╕ рдХреА рд╕реВрдЪреА рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдХреЗ рдЧреБрдг рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдЙрдирдХреЗ рдереНрд░реЗрдбреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: task_for_pid() рдФрд░ task_threads() ред

рд▓реЗрдХрд┐рди рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ, рдЕрдлрд╕реЛрд╕ред рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдЗрд╕реЗ threadmon рдХрд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ)ред рд╕рдХреНрд╖рдо рд╕реНрд░реЛрддреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдореИрдХ рдУрдПрд╕ рдПрдХреНрд╕ 10.5 рддрдХ, рдХреБрдЫ рднреА рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рддрд┐рдмрдВрдз рдкреЗрд╢ рдХрд┐рдП рдЧрдП рдереЗред рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдФрд░ рд╕рд╛рде рд╣реА, рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реБрд░рдХреНрд╖рд╛ рдврд╛рдВрдЪреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВред рдареАрдХ рд╣реИ, рдЪрд▓реЛ рд╢реБрд░реВ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ: рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВрдЧреЗ:

 #include <Security/Authorization.h> int acquireTaskportRight() { OSStatus stat; AuthorizationItem taskport_item[] = {{"system.privilege.taskport:"}}; AuthorizationRights rights = {1, taskport_item}, *out_rights = NULL; AuthorizationRef author; AuthorizationFlags auth_flags = kAuthorizationFlagExtendRights | kAuthorizationFlagPreAuthorize | kAuthorizationFlagInteractionAllowed | ( 1 << 5); stat = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, auth_flags, &author); if (stat != errAuthorizationSuccess) { return 1; } stat = AuthorizationCopyRights(author, &rights, kAuthorizationEmptyEnvironment, auth_flags, &out_rights); if (stat != errAuthorizationSuccess) { return 1; } return 0; } 

рджрд░рдЕрд╕рд▓, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЯрд╛рд╕реНрдХрдкреЛрд░реНрдЯ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдХреЗ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЯрд╛рд╕реНрдХ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП task_for_pid() ред рдЕрдм рд╣рдореЗрдВ main() рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ acquireTaskportRight() рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдФрд░ рд░рд┐рдЯрд░реНрди рдорд╛рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: 0 - рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рдЕрдиреНрдпрдерд╛ - рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реИрдВред рдЦреИрд░, рдЖрдЧреЗ рд▓рд┐рдЦрд┐рдПред рд╣рдорд╛рд░реЗ рдЗрдирдкреБрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЙрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рд╕рд╣рд╛рдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред рд╣рдо main() рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

 int main(int argc, char *argv[]) { if (argc != 2) { printf("Usage:\n %s <PID>\n", argv[0]); return -1; } if (acquireTaskportRight()) { printf("No rights granted by user or some error occured! Terminating.\n"); return -2; } char* end; pid_t pid = strtol(argv[1], &end, 10); if (*end) { printf("Error: invalid PID given: \"%s\", terminating.\n", argv[1]); return -3; } printf("Starting threadmon for PID %d\n", pid); // TODO: the rest } 

рдЕрдм рд╣рдо рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВред рд╣рдо рдкрд┐рдб рд╕реЗ рдХрд╛рд░реНрдп рдФрд░ рдЙрд╕рдХреЗ рд╕рднреА рд╕реВрддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ:

  task_t port; kern_return_t kr = task_for_pid(mach_task_self(), pid, &port); if (kr != KERN_SUCCESS) { printf("task_for_pid() returned %d, terminating.\n", kr); return -4; } thread_array_t thread_list; mach_msg_type_number_t thread_count; thread_info_data_t thinfo; mach_msg_type_number_t thread_info_count; thread_basic_info_t basic_info_th; // get threads in the task kr = task_threads(port, &thread_list, &thread_count); if (kr != KERN_SUCCESS) { printf("task_threads() returned %d, terminating.\n", kr); return -5; } 

рдЕрдм рдпрд╣ рдПрдХ рдЫреЛрдЯреА рд╕реА рдмрд╛рдд рд╣реИ: рд╕рднреА рдкреНрд░рд╛рдкреНрдд рдереНрд░реЗрдбреНрд╕ рдкрд░ рдЬрд╛рдПрдБ рдФрд░ рдЙрди рд╕реВрдЪрдирд╛рдУрдВ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓реЗрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рд╣реИ:

  long tot_cpu = 0; int j; for (j = 0; j < thread_count; j++) { thread_info_count = THREAD_INFO_MAX; kr = thread_info(thread_list[j], THREAD_BASIC_INFO, (thread_info_t)thinfo, &thread_info_count); if (kr != KERN_SUCCESS) { printf("Thread %d: Error %d\n", thread_list[j], kr); continue; } basic_info_th = (thread_basic_info_t)thinfo; if (!(basic_info_th->flags & TH_FLAGS_IDLE)) { tot_cpu = tot_cpu + basic_info_th->cpu_usage; printf("Thread %d: CPU %d%%\n", thread_list[j], basic_info_th->cpu_usage); } } printf("---\nTotal: CPU %ld%%\n", tot_cpu); return 0; 

рдЦреИрд░, рд╣рдореЗрдВ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдорд┐рд▓рд╛ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓рдЧрднрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдЫреЛрдЯреА рд╕реА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ: рдХрд╛рд░реНрдпрдХреНрд░рдо рдЕрднреА рднреА рдХреЛрдИ рдЕрдзрд┐рдХрд╛рд░ рдирд╣реАрдВ рд╣реИред рд╣рдордиреЗ рдЙрдиреНрд╣реЗрдВ рдирд╣реАрдВ рджрд┐рдпрд╛ред рд╣рдореЗрдВ рджреЛ рдФрд░ рдЪреАрдЬреЗрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: Info.plist рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдореА рдмрд╛рдЗрдирд░реА рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░реЗрдВ!

рдЗрд╕ рд╕реВрдЪреА рдХреА рддрд░рд╣ рдХреБрдЫ рдмрдирд╛рдПрдБ:

 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CFBundleDevelopmentRegion</key> <string>English</string> <key>CFBundleIdentifier</key> <string>com.silvansky.threadmon</string> <key>CFBundleInfoDictionaryVersion</key> <string>6.0</string> <key>CFBundleName</key> <string>threadmon</string> <key>CFBundleVersion</key> <string>1.0</string> <key>SecTaskAccess</key> <array> <string>allowed</string> </array> </dict> </plist> 

рдзреНрдпрд╛рди рдЕрдВрддрд┐рдо рдХреБрдВрдЬреА рдХреЛ SecTaskAccess рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП: SecTaskAccess , рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдм рд╣рдореЗрдВ Makefile рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рд╣рдорд╛рд░реА рд╕реВрдЪреА рдЬреЛрдбрд╝реЗрдВ:

 LOPTS=-framework Security -framework CoreFoundation -sectcreate __TEXT __info_plist ./Info.plist 

рдЦреИрд░, рдЕрдм рд▓рдЧрднрдЧ рд╕рдм рдХреБрдЫ, рд╕рд┐рд╕реНрдЯрдо рд╕рдордЭ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рди рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рддрдХ рд╣рдо рдЗрд╕реЗ рдЕрдкрдиреЗ рдбреЗрд╡рд▓рдкрд░ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЗ рд╕рд╛рде рд╕рд╛рдЗрди рдирд╣реАрдВ рдХрд░рддреЗ, рддрдм рддрдХ рд╡рд╣ рдЙрдиреНрд╣реЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдирд╣реАрдВ рджреЗрдЧрд╛ред

рдпрд╣рд╛рдВ рдЖрдк рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдФрд░ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрд╡рд▓рдкрд░ рдЖрдИрдбреА рдФрд░ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдмрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдХреЗрд╡рд▓ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛: рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдбреЗрд╡рд▓рдкрд░ рдЖрдИрдбреА рдкреНрд░рдорд╛рдг рдкрддреНрд░ рд╣реИ, рддреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░реЗрдВред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЖрдк рдХрд┐рдЪреЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЛрдбрд╕рд╛рдЗрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡-рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреНрд░рдорд╛рдгрдкрддреНрд░ рддреИрдпрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдЖрдЦрд┐рд░реА рддрд░реАрдХрд╛ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдУрдПрд╕ рдПрдХреНрд╕ 10.8 рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкрд╣рд▓реЗ рдХреЗ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдЗрд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд▓реЗрдХрд┐рди, рдпрджрд┐ рдЖрдкрдХреЛ рдЗрд╕ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рд░ рдмрд╛рд░ sudo рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд▓рд╕реА рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╕рд╛рдЗрди рдЗрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред =)

рд╣рдо рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рддреЗ рд╣реИрдВ:

 codesign -s "your-certificate-name" ./threadmon 

рдкрд░реАрдХреНрд╖рдг:

 $ ps -A | grep Xcode 775 ?? 617:02.82 /Applications/Xcode.app/Contents/MacOS/Xcode -psn_0_348245 73761 ttys005 0:00.00 grep Xcode $ ./threadmon 775 Starting threadmon for PID 775 Thread 6147: CPU 55% Thread 6403: CPU 0% Thread 6659: CPU 0% Thread 6915: CPU 0% Thread 7171: CPU 0% Thread 7427: CPU 0% Thread 7683: CPU 0% Thread 7939: CPU 0% Thread 8195: CPU 0% Thread 8451: CPU 0% Thread 8707: CPU 0% Thread 8963: CPU 0% Thread 9219: CPU 0% Thread 9475: CPU 0% Thread 9731: CPU 0% Thread 9987: CPU 0% Thread 10243: CPU 0% Thread 10499: CPU 0% Thread 10755: CPU 0% Thread 11011: CPU 0% Thread 11267: CPU 0% Thread 11523: CPU 22% Thread 11779: CPU 7% Thread 12035: CPU 32% Thread 12291: CPU 46% Thread 12547: CPU 14% Thread 12803: CPU 0% --- Total: CPU 176% 

рдЦреИрд░, рдХрд╛рдлреА рдпреЛрдЧреНрдп! рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд▓рд┐рдП, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдЖрдкрдХреЛ рдЧрд┐рдЯрдмрдм рднреЗрдЬреЗрдВред

PS: рдХреЛрдб StackOverflow рдФрд░ рд╡рд┐рднрд┐рдиреНрди рд╡реНрдпрдХреНрддрд┐рдЧрдд рдмреНрд▓реЙрдЧреЛрдВ рдХреЗ рдЙрддреНрддрд░ рд╕реЗ рд▓рд┐рдП рдЧрдП рд╕реНрдирд┐рдкреЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
PPS: рдпрджрд┐ рдЖрдк рд╡рд┐рдзрд┐ рдХреЛ рдмреЗрд╣рддрд░ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдХреЛрдб рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдФрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рджреЛрд╖ рджреЗрдЦреЗрдВ - рдЯрд┐рдкреНрдкрдгреА рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ!

Source: https://habr.com/ru/post/In152134/


All Articles