我想以编程方式确定是否直接从XCode(在模拟器中或在系留设备上)运行iOS应用。我尝试了此处描述的-DDEBUG解决方案,但是当我断开与Xcode的连接并重新运行该应用程序时,它仍然认为它处于调试模式。我认为我正在寻找的是此功能的Swift版本
#include <assert.h>
#include <stdbool.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/sysctl.h>
static bool AmIBeingDebugged(void)
// Returns true if the current process is being debugged (either
// running under the debugger or has a debugger attached post facto).
{
int junk;
int mib[4];
struct kinfo_proc info;
size_t size;
// Initialize the flags so that, if sysctl fails for some bizarre
// reason, we get a predictable result.
info.kp_proc.p_flag = 0;
// Initialize mib, which tells sysctl the info we want, in this case
// we're looking for information about a specific process ID.
mib[0] = CTL_KERN;
mib[1] = KERN_PROC;
mib[2] = KERN_PROC_PID;
mib[3] = getpid();
// Call sysctl.
size = sizeof(info);
junk = sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0);
assert(junk == 0);
// We're being debugged if the P_TRACED flag is set.
return ( (info.kp_proc.p_flag & P_TRACED) != 0 );
}
说明: 您的C代码(以及下面的Swift版本)检查程序是否在 调试器的控制 下运行 ,
而不是是否从Xcode运行。一个人可以在Xcode之外调试程序(直接调用lldb或gdb),一个人可以在不调试的情况下从Xcode运行程序(如果scheme设置中的“
Debug Executable”复选框已关闭)。
您可以简单地保留C函数并从Swift调用它。
但是将代码转换为Swift实际上并不复杂:
func amIBeingDebugged() -> Bool {
var info = kinfo_proc()
var mib : [Int32] = [CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()]
var size = strideofValue(info)
let junk = sysctl(&mib, UInt32(mib.count), &info, &size, nil, 0)
assert(junk == 0, "sysctl failed")
return (info.kp_proc.p_flag & P_TRACED) != 0
}
备注:
kinfo_proc()
创建一个完全初始化的结构,其中所有字段都设置为零,因此info.kp_proc.p_flag = 0
不需要设置。int
类型Int32
是Swift。sizeof(info)
C语言中的代码必须strideOfValue(info)
在Swift中包含结构填充。使用sizeofValue(info)
上述代码,对于64位设备,在Simulator中始终返回false。这是最难弄清的部分。Swift 3(Xcode 8)更新:
strideofValue
并且相关功能已不存在,已被替换为MemoryLayout
:
func amIBeingDebugged() -> Bool {
var info = kinfo_proc()
var mib : [Int32] = [CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()]
var size = MemoryLayout<kinfo_proc>.stride
let junk = sysctl(&mib, UInt32(mib.count), &info, &size, nil, 0)
assert(junk == 0, "sysctl failed")
return (info.kp_proc.p_flag & P_TRACED) != 0
}
问题内容: 我正在使用Celery管理异步任务。但是,有时候,芹菜加工过程会停止,这不会导致任何任务被执行。我希望能够检查芹菜的状态,并确保一切正常,如果我发现任何问题,请向用户显示错误消息。从Celery Worker文档中看来,我可能可以使用ping或inspect进行此操作,但是ping感觉很笨拙,并且不清楚要使用的检查方式是否确切(如果inspect()。registered()为空?)。
我想检查Quartz作业是否正在运行。我发现它可以使用调度程序。getCurrentlyExecutingJobs()。但是我对此感到困惑,我应该把它放在哪里才能得到结果呢?谢谢
问题内容: 我已经四处搜寻,但是还没有找到一个答案,该答案并未将我引向第3方服务。我不需要任何复杂的东西,只是为了保存一个值,所以当该应用程序下次打开时,我可以显示一条警报,指出该应用程序已崩溃。 谢谢。 问题答案: 感谢@RyanCollins的一点帮助,我能够自己解决问题。“ 应用程序委托”中的功能仅在应用程序正常关闭时运行。用于本地检测应用程序崩溃的代码如下所示。 全局定义的变量 应用程序委
问题内容: 标准方法如下: 在这种情况下,如果跟踪当前进程(例如,使用gdb运行或附加到该进程),则ptrace返回错误。 但这有一个严重的问题:如果调用成功返回,则gdb稍后可能不会附加到它。这是一个问题,因为我没有尝试实现反调试的东西。我的目的是在满足条件(即断言失败)并且gdb正在运行时发出“ int 3”(否则,我会得到SIGTRAP来停止应用程序)。 禁用SIGTRAP并每次发出’int
问题内容: 如何检查存储过程或查询是否仍在SQL Server中运行? 主意 我曾经想过要在过程开始时在哪里写日志,并在过程结束时将日志删除。 缺陷: 使用过程监控器 我希望能有一个可以合并为一个存储过程的解决方案和/或,作为输入,所以使用SQL Server的界面将无法正常工作跟踪程序或解决方案。 更新#1 用法示例: 该过程应该像 并在运行时(20秒内)返回true,然后在函数失败或系统重新启
问题内容: 我正在尝试创建一个bash实用程序脚本以检查我的服务器中是否正在运行docker守护进程。除了运行这样的代码之外,还有没有更好的方法来检查docker守护进程是否正在我的服务器中运行? 我想创建一个bash shell脚本,该脚本将检查我的docker守护程序是否正在运行。如果它正在运行,则什么也不做,如果没有,则启动docker守护程序。 我的伪代码是这样的。我正在考虑解析ps -e