【橘子神兽源码】【win源码公开】【haproxy 源码下载】如何attach源码_怎么使用源码

2024-11-26 14:35:41 来源:lucene 源码 分类:探索

1.vs如何attach运行过快的程序
2.ContentProvider 源码深入解析
3.gdb命令中attach使用

如何attach源码_怎么使用源码

vs如何attach运行过快的程序

       å…ˆæŠŠä½ çš„待调试的进程开启起来,然后在VS中从TOOL菜单中选中attach to process,源用源Tansport选中default表示和本机上的进程绑定,avaliable process列出了本地机器上现在运行的进程,选择你要调试的进程,然后点击attach就完成了绑定,接下来就可以开始调试了。

       å¦å¤–,attach to process也可以用于远程调试,只要更改Tansport的选项就可以了,非常方便。

       VS还有一个 附加到进程(Attach)的功能,使用这个可以对同一个程序同时多开调试了.

       åŒæ—¶è°ƒåŒä¸€ç¨‹åºåŒå¼€çš„方法(这只是其中一种):

       1) 非调试运行第一个程序,在VS中按Ctrl + F5或找到生成的exe运行.

       2) 调试运行第二个程序,在VS中按F5进行调试运行.

       3) 将第一个程序加入调试:在VS中点击 调试(debug) -> 附加到进程(Attach).

       æ‰“开附加到进程面板,从面板的进程列表中选择第一个非调试运行的程序.确定即可

ContentProvider 源码深入解析

       ContentProvider作为Android系统中核心组件之一,用于实现应用间数据共享。码使码其工作流程始于ActivityManagerService启动新进程,源用源此过程由startProcessLocked方法调用Process的码使码start方法实现。ActivityThread的源用源main方法作为整个流程的起点,创建ActivityThread实例后,码使码橘子神兽源码通过attach方法进行一系列数据操作,源用源开启主线程Looper循环。码使码

       attach方法内部首先调用ActivityManagerService的源用源attachApplication方法,经过attachApplicationLocked和ApplicationThread的码使码bindApplication方法,实现进程间的源用源调用。接着,码使码通过handler发送消息给ActivityThread的源用源handleBindApplication方法,从而创建ContextImpl与Instrumentation对象。码使码

       整个启动过程中,源用源win源码公开installContentProviders方法起到关键作用,它遍历ProviderInfo列表,通过installProvider进行ContentProvider启动操作,并将启动的ContentProvider发布到AMS中。借助ClassLoader加载ContentProvider,完成对象创建。最终调用localProvider.attachInfo(c,haproxy 源码下载 info);方法,实现ContentProvider的onCreate操作,至此,ContentProvider完成启动过程,为其他应用提供访问途径。

       随着ContentProvider的启动,ActivityManager能够访问并利用其提供的接口,实现应用间的cok类源码数据共享。这一机制简化了跨应用数据访问的复杂性,为Android系统的整体架构提供了高效的数据流通渠道。

gdb命令中attach使用

       我们先看看我们的测试程序:

       /* in eg1.c */

       int wib(int no1, int no2)

       {

       int result, diff;

       diff = no1 - no2;

       result = no1 / diff;

       return result;

       }

       int main()

       {

       pid_t pid;

       pid = fork();

       if (pid <0) {

       printf("fork err\n");

       exit(-1);

       } else if (pid == 0) {

       /* in child process */

       sleep(); ------------------ (!)

       int value = ;

       int div = 6;

       int total = 0;

       int i = 0;

       int result = 0;

       for (i = 0; i < ; i++) {

       result = wib(value, div);

       total += result;

       div++

       value--;

       }

       printf("%d wibed by %d equals %d\n" value, div, total);

       exit(0);

       } else {

       /* in parent process */

       sleep(4);

       wait(-1);

       exit(0);

       }

       }

       该测试程序中子进程运行过程中会在wib函数中出现一个‘除0‘异常。现在我们就要调试该子进程。

       [调试原理]

       不知道大家发现没有,在(!)处在我们的测试程序在父进程fork后,子进程调用sleep睡了秒。点菜软件源码这就是关键,这个sleep本来是不该存在于子进程代码中的,而是而了使用GDB调试后加入的,它是我们调试的一个关键点。为什么要让子进程刚刚运行就开始sleep呢?因为我们要在子进程睡眠期间,利用 shell命令获取其process id,然后再利用gdb调试外部进程的方法attach到该process id上,调试该进程。

       [调试过程]

       我觉上面的调试原理的思路已经很清晰了,剩下的就是如何操作的问题了。我们来实践一次吧!

       我所使用的环境是Solaris OS 9.0/GCC 3.2/GDB 6.1。

       GDB 调试程序的前提条件就是你编译程序时必须加入调试符号信息,即使用‘-g‘编译选项。首先编译我们的源程序‘gcc -g -o eg1 eg1.c‘。编译好之后,我们就有了我们的调试目标eg1。由于我们在调试过程中需要多个工具配合,所以你最好多打开几个终端窗口,另外一点需要注意的是最好在eg1的working directory下执行gdb程序,否则gdb回提示‘No symbol table is loaded‘。你还得手工load symbol table。好了,下面我们就‘按部就班‘的开始调试我们的eg1。

       执行eg1:

       eg1 & --- 让eg1后台运行吧。

       查找进程id:

       ps -fu YOUR_USER_NAME

       运行gdb:

       gdb

       (gdb)attach xxxxx--- xxxxx为利用ps命令获得的子进程process id

       (gdb)stop--- 这点很重要,你需要先暂停那个子进程,然后设置一些断点和一些Watch

       (gdb)break-- 在result = wib(value, div);这行设置一个断点,可以使用list命令察看源代码

       Breakpoint 1 at 0x: file eg1.c, line .

       (gdb)continue

       Continuing.

       Breakpoint 1, main () at eg1.c:

        result = wib(value, div);

       (gdb)step

       wib (no1=, no2=6) at eg1.c:

        diff = no1 - no2;

       (gdb)continue

       Continuing.

       Breakpoint 1, main () at eg1.c:

        result = wib(value, div);

       (gdb)step

       wib (no1=9, no2=7) at eg1.c:

        diff = no1 - no2;

       (gdb)continue

       Continuing.

       Breakpoint 1, main () at eg1.c:

        result = wib(value, div);

       (gdb)step

       wib (no1=8, no2=8) at eg1.c:

        diff = no1 - no2;

       (gdb)next

        result = no1 / diff;

       (gdb)print diff

       $6 = 0 ------- 除数为0,我们找到罪魁祸首了。

       (gdb)next

       Program received signal SIGFPE, Arithmetic exception.

       0xffd in .div () from /usr/lib/libc.so.1

       至此,我们调试完毕。

       gdb命令中attach使用

本文地址:http://0553.net.cn/html/64d687593060.html 欢迎转发