当前位置: 首页 > news >正文

网站宽带值多少合适盂县在线这个网站是谁做的

网站宽带值多少合适,盂县在线这个网站是谁做的,yw27777最新跳转接口,成立了一支网站建设的专业队伍转载自#xff1a;http://blog.csdn.net/jasonblog/article/details/49909163 如果要获取当前线程的调用栈#xff0c;可以直接使用现有API#xff1a;[NSThread callStackSymbols]。 但是并没有相关API支持获取任意线程的调用栈#xff0c;所以只能自己编码实现。 1. 基础…转载自http://blog.csdn.net/jasonblog/article/details/49909163 如果要获取当前线程的调用栈可以直接使用现有API[NSThread callStackSymbols]。 但是并没有相关API支持获取任意线程的调用栈所以只能自己编码实现。 1. 基础结构 一个线程的调用栈是什么样的呢 我的理解是应该包含当前线程的执行地址并且从这个地址可以一级一级回溯到线程的入口地址这样就反向构成了一条链线程入口执行某个方法然后逐级嵌套调用到当前现场。 图片来源于维基百科 如图所示每一级的方法调用都对应了一张活动记录也称为活动帧。也就是说调用栈是由一张张帧结构组成的可以称之为栈帧。 我们可以看到一张栈帧结构中包含着Return Address也就是当前活动记录执行结束后要返回的地址展开。 那么在我们获取到栈帧后就可以通过返回地址来进行回溯了。 2. 指令指针和基址指针 我们明确了两个目标(1)当前执行的指令(2)当前栈帧结构。 以x86为例寄存器用途如下 SP/ESP/RSP: Stack pointer for top address of the stack. BP/EBP/RBP: Stack base pointer for holding the address of the current stack frame. IP/EIP/RIP: Instruction pointer. Holds the program counter, the current instruction address. 可以看到我们可以通过指令指针来获取当前指令地址以及通过栈基址指针获取当前栈帧地址。 那么问题来了我们怎么获取到相关寄存器呢 3. 线程执行状态 考虑到一个线程被挂起时后续继续执行需要恢复现场所以在挂起时相关现场需要被保存起来比如当前执行到哪条指令了。 那么就要有相关的结构体来为线程保存运行时的状态经过一番查阅得到如下信息 The function thread_get_state returns the execution state (e.g. the machine registers) of target_thread as specified by flavor. Function - Return the execution state for a thread.SYNOPSISkern_return_t thread_get_state(thread_act_t target_thread,thread_state_flavor_t flavor,thread_state_t old_state,mach_msg_type_number_t old_state_count); /** THREAD_STATE_FLAVOR_LIST 0* these are the supported flavors*/ #define x86_THREAD_STATE32 1 #define x86_FLOAT_STATE32 2 #define x86_EXCEPTION_STATE32 3 #define x86_THREAD_STATE64 4 #define x86_FLOAT_STATE64 5 #define x86_EXCEPTION_STATE64 6 #define x86_THREAD_STATE 7 #define x86_FLOAT_STATE 8 #define x86_EXCEPTION_STATE 9 #define x86_DEBUG_STATE32 10 #define x86_DEBUG_STATE64 11 #define x86_DEBUG_STATE 12 #define THREAD_STATE_NONE 13 /* 14 and 15 are used for the internal x86_SAVED_STATE flavours */ #define x86_AVX_STATE32 16 #define x86_AVX_STATE64 17 #define x86_AVX_STATE 18 所以我们可以通过这个API搭配相关参数来获得想要的寄存器信息 bool jdy_fillThreadStateIntoMachineContext(thread_t thread, _STRUCT_MCONTEXT *machineContext) {mach_msg_type_number_t state_count x86_THREAD_STATE64_COUNT;kern_return_t kr thread_get_state(thread, x86_THREAD_STATE64, (thread_state_t)machineContext-__ss, state_count);return (kr KERN_SUCCESS); } 这里引入了一个结构体叫_STRUCT_MCONTEXT。 4. 不同平台的寄存器 _STRUCT_MCONTEXT在不同平台上的结构不同 x86_64如iPhone 6模拟器 _STRUCT_MCONTEXT64 {_STRUCT_X86_EXCEPTION_STATE64 __es;_STRUCT_X86_THREAD_STATE64 __ss;_STRUCT_X86_FLOAT_STATE64 __fs; };_STRUCT_X86_THREAD_STATE64 {__uint64_t __rax;__uint64_t __rbx;__uint64_t __rcx;__uint64_t __rdx;__uint64_t __rdi;__uint64_t __rsi;__uint64_t __rbp;__uint64_t __rsp;__uint64_t __r8;__uint64_t __r9;__uint64_t __r10;__uint64_t __r11;__uint64_t __r12;__uint64_t __r13;__uint64_t __r14;__uint64_t __r15;__uint64_t __rip;__uint64_t __rflags;__uint64_t __cs;__uint64_t __fs;__uint64_t __gs; }; x86_32如iPhone 4s模拟器 _STRUCT_MCONTEXT32 {_STRUCT_X86_EXCEPTION_STATE32 __es;_STRUCT_X86_THREAD_STATE32 __ss;_STRUCT_X86_FLOAT_STATE32 __fs; };_STRUCT_X86_THREAD_STATE32 {unsigned int __eax;unsigned int __ebx;unsigned int __ecx;unsigned int __edx;unsigned int __edi;unsigned int __esi;unsigned int __ebp;unsigned int __esp;unsigned int __ss;unsigned int __eflags;unsigned int __eip;unsigned int __cs;unsigned int __ds;unsigned int __es;unsigned int __fs;unsigned int __gs; }; ARM64如iPhone 5s _STRUCT_MCONTEXT64 {_STRUCT_ARM_EXCEPTION_STATE64 __es;_STRUCT_ARM_THREAD_STATE64 __ss;_STRUCT_ARM_NEON_STATE64 __ns; };_STRUCT_ARM_THREAD_STATE64 {__uint64_t __x[29]; /* General purpose registers x0-x28 */__uint64_t __fp; /* Frame pointer x29 */__uint64_t __lr; /* Link register x30 */__uint64_t __sp; /* Stack pointer x31 */__uint64_t __pc; /* Program counter */__uint32_t __cpsr; /* Current program status register */__uint32_t __pad; /* Same size for 32-bit or 64-bit clients */ }; ARMv7/v6如iPhone 4s _STRUCT_MCONTEXT32 {_STRUCT_ARM_EXCEPTION_STATE __es;_STRUCT_ARM_THREAD_STATE __ss;_STRUCT_ARM_VFP_STATE __fs; };_STRUCT_ARM_THREAD_STATE {__uint32_t __r[13]; /* General purpose register r0-r12 */__uint32_t __sp; /* Stack pointer r13 */__uint32_t __lr; /* Link register r14 */__uint32_t __pc; /* Program counter r15 */__uint32_t __cpsr; /* Current program status register */ }; 通过了解以上不同平台的寄存器结构我们可以编写出比较通用的回溯功能。 5. 算法实现 /*** 关于栈帧的布局可以参考* https://en.wikipedia.org/wiki/Call_stack* http://www.cs.cornell.edu/courses/cs412/2008sp/lectures/lec20.pdf* http://eli.thegreenplace.net/2011/09/06/stack-frame-layout-on-x86-64/*/ typedef struct JDYStackFrame {const struct JDYStackFrame* const previous;const uintptr_t returnAddress; } JDYStackFrame;//int jdy_backtraceThread(thread_t thread, uintptr_t *backtraceBuffer, int limit) {if (limit 0) return 0;_STRUCT_MCONTEXT mcontext;if (!jdy_fillThreadStateIntoMachineContext(thread, mcontext)) {return 0;}int i 0;uintptr_t pc jdy_programCounterOfMachineContext(mcontext);backtraceBuffer[i] pc;if (i limit) return i;uintptr_t lr jdy_linkRegisterOfMachineContext(mcontext);if (lr ! 0) {/* 由于lr保存的也是返回地址所以在lr有效时应该会产生重复的地址项 */backtraceBuffer[i] lr;if (i limit) return i;}JDYStackFrame frame {0};uintptr_t fp jdy_framePointerOfMachineContext(mcontext);if (fp 0 || jdy_copyMemory((void *)fp, frame, sizeof(frame)) ! KERN_SUCCESS) {return i;}while (i limit) {backtraceBuffer[i] frame.returnAddress;if (frame.returnAddress 0|| frame.previous NULL|| jdy_copyMemory((void *)frame.previous, frame, sizeof(frame)) ! KERN_SUCCESS) {break;}}return i; }
http://www.huolong8.cn/news/369658/

相关文章:

  • 网站备案需要多久时间推荐网站建设品牌
  • 东阳网站建设有哪些宜昌市上海中学官网
  • 商务网站建设摘要东台市住房和建设局网站
  • 开发建设信息的网站网站哪里可以查到做ddos
  • 扁平化设计网站台州网站建设兼职
  • 扁平化色彩网站ps网页设计实验报告
  • 企业网站建设的开放方式一般有wordpress登陆评论
  • 旅游宣传网站建设方案网站备案多个域名备案单上填几个
  • 用php做网站的方法广州 关于进一步优化
  • 什么好的网站学做食品定制手机软件
  • 网站必须做可信认证网页设计作业5000字
  • 网站新闻模块代码wordpress建站教程凌风
  • 上海360网站建设标小智logo在线设计
  • 重庆seo整站优化wordpress主题库
  • 网站建设 安庆微盟公司简介
  • 杭州电商网站策划设计公司优化是什么意思?
  • 网站建设开发报价表多少钱一斤怎么算
  • 门户网站的三大基本特征简述如何让网站排名快速提升
  • 建设银行网站201308做北京塞车网站
  • seo的网站特征Wordpress判断来路 显示
  • 网站系统维护一般多久qq客户端登录
  • 做百度网站需不需要备案东莞市研发网站建设品牌
  • 如何登陆网站服务器下载全网搜
  • 网站开发建设费用包括那些网站文章排版的重要性
  • 南江移动网站建设活动手机网站开发
  • 廊坊网站合肥搜索优化排名
  • 网站建设及维护服务用凡科做的网站保存不了
  • 免费自助建站系统吴江设计网站公司
  • 西安网站建设价格明细微信营销的方法和技巧
  • 官方网站建设平台港南网站建设