ios判断程序是否处于调试状态

5953次浏览

当一个应用被调试的时候,会给进程设置一个标识(P_TRACED),我们可以通过检测该进程是否有设置这个标识来检测进程是否正在被调试以保护好我们的应用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <sys/types.h>
#include <sys/sysctl.h>
 
static int check_debugger( ) __attribute__((always_inline));
 
static int check_debugger( )
{
    size_t size = sizeof(struct kinfo_proc);
    struct kinfo_proc info;
    int ret,name[4];
 
    memset(&info, 0, sizeof(struct kinfo_proc));
 
    name[0] = CTL_KERN;
    name[1] = KERN_PROC;
    name[2] = KERN_PROC_PID;
    name[3] = getpid();
 
    if((ret = (sysctl(name, 4, &info, &size, NULL, 0)))){
        return ret;  //sysctl() failed for some reason
    }
 
    return (info.kp_proc.p_flag & P_TRACED) ? 1 : 0;
}

如果你不确信产生的目标代码以inline的方式编译该函数,你也可以将其转化成宏的方式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#define DEBUGGER_CHECK {                                \
    size_t size = sizeof(struct kinfo_proc);            \
    struct kinfo_proc info;                             \
    int ret,name[4];                                    \
                                                        \
    memset(&info, 0, sizeof(struct kinfo_proc));        \
                                                        \
    name[0] = CTL_KERN;                                 \
    name[1] = KERN_PROC;                                \
    name[2] = KERN_PROC_PID;                            \
    name[3] = getpid();                                 \
                                                        \
    if(ret = (sysctl(name, 4, &info, &size, NULL, 0))){ \
        return (EXIT_FAILURE);                          \
    }                                                   \
                                                        \
    if(info.kp_proc.p_flag & P_TRACED){                 \
        /* Code to react to debugging goes here */      \
    }                                                   \
}

cocos2dx3.10 TiledMap超大显示

889次浏览

cocos2dx支持TiledMap的加载和显示,挺方便的。不过方便之余也有诸多的限制,如一个图集不能放在两个层上,还有就是当格子数超过一定数量时就不显示了。

图集问题就不说了,做的时候小心一点就可以了。下面来说说超大地格的显示问题。基本思路是当地图移动的时候,重新计算层的VBO。具体代码请下载查看,这里就不贴了。

以下是应用示例:

1
2
3
4
5
6
7
8
9
10
auto tiledMap = tmx::EasyTMXTiledMap::create("map.tmx");
tiledMap->setAnchorPoint(Vec2(0.5, 0.5));
tiledMap->setPosition(tiledMap->getContentSize() * 0.5);
auto scroll = cocos2d::ui::ScrollView::create();
scroll->setContentSize(getContentSize());
scroll->setInnerContainerSize(tiledMap->getContentSize());
scroll->setDirection(cocos2d::ui::ScrollView::Direction::BOTH);
scroll->addChild(tiledMap);
scroll->jumpToPercentBothDirection(Vec2(50, 50));
addChild(scroll);

代码下载:
EasyTXMTiledMap.zip