深入浅出深入浅出深入深出浅入浅出浅入深出.docx
《深入浅出深入浅出深入深出浅入浅出浅入深出.docx》由会员分享,可在线阅读,更多相关《深入浅出深入浅出深入深出浅入浅出浅入深出.docx(46页珍藏版)》请在冰点文库上搜索。
深入浅出深入浅出深入深出浅入浅出浅入深出
[深入浅出]深入浅出、深入深出、浅入浅出、浅入深出
[深入浅出]深入浅出、深入深出、浅入浅出、
浅入深出
篇一:
深入浅出、深入深出、浅入浅出、浅入深出
在网上读到这样一段话:
世界上有四种老师,第一种是讲课能深入浅出,很深奥的道理,他能讲得浅显易懂,很受学生的欢迎,这是最好的老师;第二种是深入深出,这样的老师很有学问,但缺乏好的教学方法,不能把深奥的学问讲得浅显易懂,学生学起来就费劲,这也算是好老师;第三种是浅入浅出,这样的老师本身学问不深,但却实事求是,把自己懂的东西讲出来,这也能基本保证质量,也算是个好老师;最糟糕的是第四种老师,浅入深出,本身并无多大学问,却装腔作势,把本来很浅近的道理讲得玄而又玄,让人听不懂。
对比一下,我大概属于第三种。
一般我搞不懂的东西,我会避开不讲,只讲自己弄懂的东西;弄懂多少就讲多少。
学生问我问题,我会结合自己的切身经历告诉他自己碰到同样的问题会怎么做,甚至恨不得亲自示范给他/她看。
我知道有一种老师,他们总是能站在更高的地方给学生方法论方面的指导;我也见过另一种老师,他们对学生提出的问题总不正面回答,而是大谈一番似是而非不着边际的话题。
譬如学生问:
老师,我想去云南自助游,应该怎么走,我会告诉他,我去过丽江,当年我是怎么走的。
但学生也许想去的是卢沽湖,
我会说那里我没去过,但你可以先到丽江再打听怎样去卢沽湖,或者参照我当年的方法去寻找路线;另一种老师会这样回答:
你可以到某某网站或某本书上去了解去那里的路线,并告诉他如何找到那个网站或那本书和出行的注意事项;还有一种老师会说:
我写过一篇《自助游的兴起、演变、未来趋势和宏观管理战略》的文章,反响很大,你去找来看看吧,看完就知道怎么去了。
呵呵!
篇二:
深入浅出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