深入浅出深入浅出深入深出浅入浅出浅入深出.docx

上传人:b****5 文档编号:8803377 上传时间:2023-05-15 格式:DOCX 页数:46 大小:34.02KB
下载 相关 举报
深入浅出深入浅出深入深出浅入浅出浅入深出.docx_第1页
第1页 / 共46页
深入浅出深入浅出深入深出浅入浅出浅入深出.docx_第2页
第2页 / 共46页
深入浅出深入浅出深入深出浅入浅出浅入深出.docx_第3页
第3页 / 共46页
深入浅出深入浅出深入深出浅入浅出浅入深出.docx_第4页
第4页 / 共46页
深入浅出深入浅出深入深出浅入浅出浅入深出.docx_第5页
第5页 / 共46页
深入浅出深入浅出深入深出浅入浅出浅入深出.docx_第6页
第6页 / 共46页
深入浅出深入浅出深入深出浅入浅出浅入深出.docx_第7页
第7页 / 共46页
深入浅出深入浅出深入深出浅入浅出浅入深出.docx_第8页
第8页 / 共46页
深入浅出深入浅出深入深出浅入浅出浅入深出.docx_第9页
第9页 / 共46页
深入浅出深入浅出深入深出浅入浅出浅入深出.docx_第10页
第10页 / 共46页
深入浅出深入浅出深入深出浅入浅出浅入深出.docx_第11页
第11页 / 共46页
深入浅出深入浅出深入深出浅入浅出浅入深出.docx_第12页
第12页 / 共46页
深入浅出深入浅出深入深出浅入浅出浅入深出.docx_第13页
第13页 / 共46页
深入浅出深入浅出深入深出浅入浅出浅入深出.docx_第14页
第14页 / 共46页
深入浅出深入浅出深入深出浅入浅出浅入深出.docx_第15页
第15页 / 共46页
深入浅出深入浅出深入深出浅入浅出浅入深出.docx_第16页
第16页 / 共46页
深入浅出深入浅出深入深出浅入浅出浅入深出.docx_第17页
第17页 / 共46页
深入浅出深入浅出深入深出浅入浅出浅入深出.docx_第18页
第18页 / 共46页
深入浅出深入浅出深入深出浅入浅出浅入深出.docx_第19页
第19页 / 共46页
深入浅出深入浅出深入深出浅入浅出浅入深出.docx_第20页
第20页 / 共46页
亲,该文档总共46页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

深入浅出深入浅出深入深出浅入浅出浅入深出.docx

《深入浅出深入浅出深入深出浅入浅出浅入深出.docx》由会员分享,可在线阅读,更多相关《深入浅出深入浅出深入深出浅入浅出浅入深出.docx(46页珍藏版)》请在冰点文库上搜索。

深入浅出深入浅出深入深出浅入浅出浅入深出.docx

深入浅出深入浅出深入深出浅入浅出浅入深出

[深入浅出]深入浅出、深入深出、浅入浅出、浅入深出

[深入浅出]深入浅出、深入深出、浅入浅出、

浅入深出

篇一:

深入浅出、深入深出、浅入浅出、浅入深出

在网上读到这样一段话:

世界上有四种老师,第一种是讲课能深入浅出,很深奥的道理,他能讲得浅显易懂,很受学生的欢迎,这是最好的老师;第二种是深入深出,这样的老师很有学问,但缺乏好的教学方法,不能把深奥的学问讲得浅显易懂,学生学起来就费劲,这也算是好老师;第三种是浅入浅出,这样的老师本身学问不深,但却实事求是,把自己懂的东西讲出来,这也能基本保证质量,也算是个好老师;最糟糕的是第四种老师,浅入深出,本身并无多大学问,却装腔作势,把本来很浅近的道理讲得玄而又玄,让人听不懂。

对比一下,我大概属于第三种。

一般我搞不懂的东西,我会避开不讲,只讲自己弄懂的东西;弄懂多少就讲多少。

学生问我问题,我会结合自己的切身经历告诉他自己碰到同样的问题会怎么做,甚至恨不得亲自示范给他/她看。

我知道有一种老师,他们总是能站在更高的地方给学生方法论方面的指导;我也见过另一种老师,他们对学生提出的问题总不正面回答,而是大谈一番似是而非不着边际的话题。

譬如学生问:

老师,我想去云南自助游,应该怎么走,我会告诉他,我去过丽江,当年我是怎么走的。

但学生也许想去的是卢沽湖,

我会说那里我没去过,但你可以先到丽江再打听怎样去卢沽湖,或者参照我当年的方法去寻找路线;另一种老师会这样回答:

你可以到某某网站或某本书上去了解去那里的路线,并告诉他如何找到那个网站或那本书和出行的注意事项;还有一种老师会说:

我写过一篇《自助游的兴起、演变、未来趋势和宏观管理战略》的文章,反响很大,你去找来看看吧,看完就知道怎么去了。

呵呵!

篇二:

深入浅出WinDbg——利用快速定位错误

Sharepoint代码的某方法LoadLines中使用了SPSecurity.RunWithElevatedPrivileges

此方法两次调用了Common.GetLookupValue,并且问题可能出在这里。

[,

由于开发环境没有VS2008,所以我们使用WinDbg进行调试。

针对这种情况有两种方式:

1LoadSOS

2通过快速捕捉异常的方式来快速定位错误

1打开WinDbg,附加对应的w3wp.exe进程。

2刷新出错页面,运行命令!

ueip以反汇编的方式来查看内存

3通过搜索>>>快速定位出错点,然后分析出错的上下文,定位可能的出错语句位置:

000007ff`013003f3e8c8ddffffcall000007ff`012fe1c0,

mdToken:

060000d0)

4运行命令r,查看寄存器指针引用的值为空引起的

1查看!

ueip的结果,搜索关键字Common.GetLookupValue

000007ff`013003f3e8c8ddffffcall000007ff`012fe1c0,

mdToken:

060000d0)

2bp000007ff013003f3即可设定断点。

参考下载:

篇三:

Android深入浅出之Binder机制

Android深入浅出之Binder机制

一说明

Android系统最常见也是初学者最难搞明白的就是Binder了,很多很多的Service就是通过Binder机制来和客户端通讯交互的。

就是一个和普通的C++应用程序一样的东西。

MediaService的源码文件在:

framework\base\Media\MediaServer\Main_mediaserver.cpp中。

让我们看看到底是个什么玩意儿~

intmain

{

//FT,就这么简单,,

//获得一个ProcessState实例

spproc);

//得到一个ServiceManager对象

spsm=defaultServiceManager;

MediaPlayerService:

:

instantiate;//初始化MediaPlayerService服务

ProcessState:

:

self->startThreadPool;//看名字,启动Process的线程池,

IPCThreadState:

:

self->joinThreadPool;//将自己加入到刚才的线程池,

}

其中,我们只分析MediaPlayerService。

这么多疑问,看来我们只有一个个函数深入分析了。

不过,这里先简单介绍下sp这个东西。

sp,究竟是smartpointer还是strongpointer呢,其实我后来发现不用太关注这个,就把它当做一个普通的指针看待,即sp======》IServiceManager*吧。

sp是google搞出来的为了方便C/C++程序员管理指针的分配和释放的一套方法,类似JAVA的什么WeakReference

之类的。

我个人觉得,要是自己写程序的话,不用这个东西也成。

好了,以后的分析中,sp就看成是XXX*就可以了。

第一个调用的函数是ProcessState:

:

self,然后赋值给了proc变

量,程序运行完,proc会自动delete内部的内容,所以就自动释放了先前分配的资源。

ProcessState位置在framework\base\libs\binder\ProcessState.cpp

spProcessState:

:

self

{

ifreturngProcess;---->第一次进来肯定不走这儿

AutoMutex_l;--->锁保护

ifgProcess=newProcessState;--->创建一个ProcessState对象

returngProcess;--->看见没,这里返回的是指针,但是函数返回的是sp,所以

//把sp看成是XXX*是可以的

}

再来看看ProcessState构造函数

//这个构造函数看来很重要

ProcessState:

:

ProcessState

:

mDriverFD)----->Android很多代码都是这么写的,稍不留神就没看见这里调用了一个很重要的函数

mVMStart//映射内存的起始地址

mManagesContexts

mBinderContextCheckFunc

mBinderContextUserData

mThreadPoolStarted

mThreadPoolSeq

{

if{

//BIDNER_VM_SIZE定义为-1M-8K

mVMStart=mmap;//这个需要你自己去manmmap的用法了,不过大概意思就是

//将fd映射为内存,这样内存的memcpy等操作就相当于write/read了

}

...

}

最讨厌这种在构造list中添加函数的写法了,常常疏忽某个变量的初始化是一个函数调用的结果。

open_driver,就是打开/dev/binder这个设备,这个是android在内核中搞的一个专门用于完成

进程间通讯而设置的一个虚拟的设备。

BTW,说白了就是内核的提供的一个机制,这个和我们用socket加NET_LINK方式和内核通讯是一个道理。

staticintopen_driver

{

intfd=open;//打开/dev/binder

if{

....

size_tmaxThreads=15;

//通过ioctl方式告诉内核,这个fd支持最大线程数是15个。

result=ioctl;}

returnfd;

好了,到这里Process:

:

self就分析完了,到底干什么了呢,

l打开/dev/binder设备,这样的话就相当于和内核binder机制有了交互的通道

l映射fd到内存,设备的fd传进去后,估计这块内存是和binder设备共享的

接下来,就到调用defaultServiceManager地方了。

扩展:

androidbinder机制/android的binder机制/binder机制

defaultServiceManager位置在framework\base\libs\binder\IServiceManager.cpp中

spdefaultServiceManager

{

ifreturngDefaultServiceManager;

//又是一个单例,设计模式中叫singleton。

{

AutoMutex_l;

if{

//真正的gDefaultServiceManager是在这里创建的喔

gDefaultServiceManager=interface_cast->getContextObject);

}

}

returngDefaultServiceManager;

}

-----》

gDefaultServiceManager=interface_cast->getContextObject);

ProcessState:

:

self,肯定返回的是刚才创建的gProcess,然后调用它的getContextObject,注意,传进去的是NULL,即0

//回到ProcessState类,

spProcessState:

:

getContextObject

{

if){//该函数根据打开设备是否成功来判断是否支持process,

//在真机上肯定走这个

returngetStrongProxyForHandle;//注意,这里传入0

}

}

----》进入到getStrongProxyForHandle,函数名字怪怪的,经常严重阻碍大脑运转

//注意这个参数的命名,handle。

搞过windows的应该比较熟悉

这个名字,这是对

//资源的一种标示,其实说白了就是某个数据结构,保存在数组中,然后handle是它在这个数组中的索引。

--->就是这么一个玩意儿

spProcessState:

:

getStrongProxyForHandle

{

spresult;

AutoMutex_l;

handle_entry*e=lookupHandleLocked;--》哈哈,果然,从数组中查找对应

索引的资源,lookupHandleLocked这个就不说了,内部会返回一个handle_entry

下面是handle_entry的结构

/*

structhandle_entry{

IBinder*binder;--->Binder

RefBase:

:

weakref_type*refs;-->不知道是什么,不影响.

};

*/

if{

IBinder*b=e->binder;-->第一次进来,肯定为空

if){

b=newBpBinder;--->看见了吧,创建了一个新的BpBinder

e->binder=b;

result=b;

}....

}

returnresult;返回刚才创建的BpBinder。

}

//到这里,是不是有点乱了,对,当人脑分析的函数调用太深的时候,就容易忘记。

我们是从gDefaultServiceManager=

interface_cast->getContextObject);

开始搞的,现在,这个函数调用将变成

gDefaultServiceManager=interface_cast);

BpBinder又是个什么玩意儿,Android名字起得太眼花缭乱了。

因为还没介绍Binder机制的大架构,所以这里介绍BpBinder不合适,但是又讲到BpBinder了,不介绍Binder架构似乎又说不清楚....,sigh~

恩,还是继续把层层深入的函数调用栈化繁为简吧,至少大脑还可以工作。

先看看BpBinder的构造函数把。

BpBinder位置在framework\base\libs\binder\BpBinder.cpp中。

BpBinder:

:

BpBinder

:

mHandle//注意,接上述内容,这里调用的时候传入的是0

mAlive

mObitsSent

mObituaries

{

IPCThreadState:

:

self->incWeakHandle;//FT,竟然到IPCThreadState:

:

self

}

这里一块说说吧,IPCThreadState:

:

self估计怎么着又是一个singleton吧,

//该文件位置在framework\base\libs\binder\IPCThreadState.cpp

IPCThreadState*IPCThreadState:

:

self

{

if{//第一次进来为false

restart:

constpthread_key_tk=gTLS;扩展:

androidbinder机制/android的binder机制/binder机制

//TLS是ThreadLocalStorage的意思,不懂得自己去google下它的作用吧。

这里只需要

//知道这种空间每个线程有一个,而且线程间不共享这些空间,好处是,我就不用去搞什么

//同步了。

在这个线程,我就用这个线程的东西,反正别的线程获取不到其他线程TLS中的数据。

===》这句话有漏洞,钻牛角尖的明白大概意思就可以了。

//从线程本地存储空间中获得保存在其中的IPCThreadState对象

//这段代码写法很晦涩,看见没,只有pthread_getspecific,那么肯定有地方调用

//pthread_setspecific。

IPCThreadState*st=pthread_getspecific;

ifreturnst;

returnnewIPCThreadState;//new一个对象,

}

ifreturnNULL;

pthread_mutex_lock;

if{

if!

=0){

pthread_mutex_unlock;

returnNULL;

}

gHaveTLS=true;

}

pthread_mutex_unlock;

gotorestart;//我FT,其实goto没有我们说得那样卑鄙,汇编代码很多跳转语句的。

//关键是要用好。

}

//这里是构造函数,在构造函数里边pthread_setspecific

IPCThreadState:

:

IPCThreadState

:

mProcess),mMyThreadId)

{

pthread_setspecific;

clearCaller;

mIn.setDataCapacity;

//mIn,mOut是两个Parcel,干嘛用的啊,把它看成是命令的buffer吧。

再深入解释,又会大脑停摆的。

mOut.setDataCapacity;

}

出来了,终于出来了....,恩,回到BpBinder那。

BpBinder:

:

BpBinder

:

mHandle//注意,接上述内容,这里调用的时候传入的是0

mAlive

mObitsSent

mObituaries

{

......

IPCThreadState:

:

self->incWeakHandle;

什么incWeakHandle,不讲了..

}

喔,newBpBinder就算完了。

到这里,我们创建了些什么呢,

lProcessState有了。

lIPCThreadState有了,而且是主线程的。

lBpBinder有了,内部handle值为0

gDefaultServiceManager=interface_cast);

终于回到原点了,大家是不是快疯掉了,

interface_cast,我第一次接触的时候,把它看做类似的static_cast一样的东西,然后死活也搞不明白BpBinder*指针怎么能强转为

IServiceManager*,花了n多时间查看BpBinder是否和

IServiceManager继承还是咋的....。

终于,我用ctrl+鼠标跟踪进入了interface_cast

IInterface.h位于framework/base/include/binder/IInterface.h

template

inlinespinterface_cast

{

returnINTERFACE:

:

asInterface;

}

所以,上面等价于:

inlinespinterface_cast

{

returnIServiceManager:

:

asInterface;

}

看来,只能跟到IServiceManager了。

IServiceManager.h---》

framework/base/include/binder/IServiceManager.h

看看它是如何定义的:

classIServiceManager:

publicIInterface

{

//ServiceManager,字面上理解就是Service管理类,管理什么,

增加服务,查询服务等

//这里仅列出增加服务addService函数

public:

DECLARE_META_INTERFACE;

virtualstatus_taddService=0;

};

DECLARE_META_INTERFACE,,

怎么和MFC这么类似,微软的影响很大啊~知道MFC的,有

DELCARE肯定有IMPLEMENT

果然,这两个宏DECLARE_META_INTERFACE和

IMPLEMENT_META_INTERFACE都在

刚才的IInterface.h中定义。

我们先看看

DECLARE_META_INTERFACE这个宏往IServiceManager加了什

么,

下面是DECLARE宏

#defineDECLARE_META_INTERFACE\扩展:

androidbinder机制/android的binder机制/binder机制

staticconstandroid:

:

String16descriptor;\

staticandroid:

:

spasInterface;\

virtualconstandroid:

:

String16&getInterfaceDescriptorconst;\

I##INTERFACE;\

virtual~I##INTERFACE;

我们把它兑现到IServiceManager就是:

staticconstandroid:

:

String16descriptor;-->喔,增加一个描述字

符串

staticandroid:

:

spasInterface---》增加一个asInterface函数

virtualconstandroid:

:

String16&getInterfaceDescriptorconst;---》

增加一个get函数

估计其返回值就是descriptor这个字符串

IServiceManager;\

virtual~IServiceManager;增加构造和虚析购函数...

那IMPLEMENT宏在哪定义的呢,

见IServiceManager.cpp。

位于

framework/base/libs/binder/IServiceManager.cpp

IMPLEMENT_META_INTERFACE;

下面是这个宏的定义

#defineIMPLEMENT_META_INTERFACE\

constandroid:

:

String16I##INTERFACE:

:

descriptor;\

constandroid:

:

String16&\

I##INTERFACE:

:

getInterfaceDescriptorconst{\

return

I##INTERFACE:

:

descriptor;\

}\

android:

:

spI##INTERFACE:

:

asInterface\

{\

android:

:

spintr;\

if{\扩展:

androidbinder机制/android的

binder机制/binder机制

intr=static_cast.get);\

if{\

intr=newBp##INTERFACE;\

}\

}\

returnintr;\

}\

I##INTERFACE:

:

I##INTERFACE

{}\

I##INTERFACE:

:

~I##INTERFACE{}\

很麻烦吧,尤其是宏看着头疼。

赶紧兑现下吧。

const

android:

:

String16IServiceManager:

:

descriptor;

constandroid:

:

String16&IServiceManager:

:

getInterfaceDescriptor

const

{returnIServiceManager:

:

descriptor;//返回上面那个

android.os.IServiceManager

}android:

:

spIServiceManager:

:

asInterface

{

android:

:

spintr;

if{扩展:

androidbinder机制/android的

binder机制/binder机制

intr=static_cast.get);

if{

intr=newBpServiceManager;

}

}

returnintr;

}

IServiceManager:

:

IServiceManager{}

IServiceManager:

:

~IServiceManager{}

哇塞,asInterface是这么搞的啊,赶紧分析下吧,还是不知道

interface_cast怎么把BpBinder*转成了IServiceManager

我们刚才解析过的interface_cast),

原来就是调用asInterface)

android:

:

spIServiceManager:

:

asInterface

{

android:

:

spintr;

if{

....

intr=newBpServiceManager;

//神呐,终于看到和IServiceManager相关的东西了,看来

//实际返回的是BpServiceManager);

}扩展:

androidbinder机制/android的binder机制/bind

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2