《数据库内核分析实践指导.pptx》由会员分享,可在线阅读,更多相关《数据库内核分析实践指导.pptx(29页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、数据库内核分析实践指导Source Insight、GDB、.计算机学院数据管理研究所彭煜玮Email:QQ:810410提纲2代码阅读利器Source Insight构建自己的代码阅读、调试环境单机Windows(方案一):SI+VMWare单机Windows(方案二):SI+Portable Ubuntu单机Linux:Wine+SI双机:SI+SSH源代码的下载、编译调试跟踪工具GDB其他资源Source Insight简介3Source Insight是一个面向项目开发的程序编辑器和代码浏览器,它拥有内置的对C/C+,C#和Java等程序的分析。Source Insight能分析你的源
2、代码并在你工作的同时动态维护它自己的符号数据库,并自动为你显示有用的上下文信息。Source Insight不仅仅是一个强大的程序编辑器,它还能显示reference trees,class inheritance diagrams和call trees。Source Insight提供了最快速的对源代码的导航和任何程序编辑器的源信息。Source Insight提供了快速和革新的访问源代码和源信息的能力。与众多其它编辑器产品不同,Source Insight能在你编辑的同时分析你的源代码,为你提供实用的信息并立即进行分析。SI下载及安装430天试用版可以从:下载安装过程和所有的Windows
3、软件类似创建项目5构建环境6单机Windows(方案一):在Windows下安装SI阅读代码;在Windows下安装虚拟机软件如VMWare,在虚拟机中安装Linux,设置好虚拟机和宿主机之间的共享目录,把源代码都放在共享目录中;所有的编译、调试工作都在虚拟机中进行。优缺点:只需一台机器,不需脱离熟悉的Windows环境;虚拟机会拖慢机器速度,编译调试速度不稳定,用共享目录同步修改的源代码比较麻烦。构建环境7单机Windows(方案二):在Windows下安装SI阅读代码;在Windows下安装Portable Ubuntu;所有的编译、调试工作都在Ubuntu中进行。优缺点:优点同方案一,且
4、占用磁盘空间更小,文件交换更方便。缺点也类同。构建环境8单机Linux:在Linux下安装Wine模拟器,然后用Wine模拟SI用作代码阅读;直接用Linux的gcc、gdb编译调试代码。优缺点:原生支持代码编译调试,阅读代码和调试代码可以使用同一份,无需文件同步,效率最高;需要熟悉Linux使用,Wine有时不太稳定。构建环境9双机:在A机上装Windows、SI和SSH客户端;在B机上安装Linux;用A机进行代码阅读或修改,将修改过后的代码用SSH客户端的文件上传功能传送到B机;在A机上通过SSH远程登录B机然后调试代码。优缺点:效率高,兼顾使用习惯和编译环境;文件传送麻烦,容易出现传错
5、文件的问题,且投资大(需要两台机器)。源代码下载和编译10PostgreSQL的源代码可以在其官网下载:请下载最新的版代码阅读PostgreSQL编译时一般需要系统中安装下列软件:readline:命令行编辑的支持库zlib:数据压缩支持库flex:词法分析bison:语法分析源代码编译11PostgreSQL的编译安装和通常的Linux源代码编译安装具有类似的步骤:解压configuremakemake install编译安装后的工作12创建或者选择管理DBMS的Linux用户,该用户不能具有root权限,假设为postgres创建数据目录,为postgres用户授权限:Initdb,初始化
6、数据集簇可以两种方式运行:initdb D datadir设置PGDATA环境变量来指明datadir,直接运行initdb启动DBMS13在postgres用户下,运行pg_ctl start D datadir启动DBMS。如果设置了PGDATA环境变量,-D可以省略。使用psql等自带工具管理DBMS14psql是PG自带的命令行客户端psql l可以列出本地机器上有哪些现成的数据库psql DBNAME可以连接到指定的数据库执行SQL命令或者扩展命令createdb DBNAME创建数据库,dropdb DBNAME删除数据库GDB简介GDB主要能为你做四件事(包括为了完成这些事而附加
7、的功能),帮助你找出程序中的错误。*运行你的程序,设置所有的能影响程序运行的东西。*保证你的程序在指定的条件下停止。*当你程序停止时,让你检查发生了什么。*改变你的程序。那样你可以试着修正某个bug引起的 问题,然后继续查找另一个bug。15如何用GDB调试程序命令:gdb 进入gdb界面,提示符为(gdb),用命令quit或者q退出。注意:要用gdb调试的程序应该用gcc-g -o 进行编译。-g是表示生成带源代码调试符号的程序。16设置断点设置断点的命令是:break:在文件的第几行设置断点break:在文件的某个函数设断点break都可以简写成b。查看当前所设置断点的命令:info br
8、eak删除断点:delete clear:辅助命令:list或者l,可以显示程序的源代码,帮助设置断点。17开始调试开始调试的命令:run或者r这个命令会使被调试的程序开始在gdb控制下开始运行,并且会在第一个断点处停下来,屏幕提示将要执行的语句。让程序带参数运行:run .r .18继续程序的方法单步进入调试命令:step或者s,这个命令在下一条语句为函数时会进入函数内部执行。单步调试命令:next或者n,这个命令不会进入函数。继续运行:continure或者c,让程序继续运行,直到碰到下一个断点才暂停。19显示变量值、栈内容显示变量的值:print p 跟踪变量的值:watch 这个命令可
9、以观察一个变量的值。每次中断时都会显示这个变量的值显示栈中的内容:backtrace或bt20GDB的其他功能指定源代码所在的目录:directory 告诉gdb到DIR指定的目录中寻找当前调试程序的代码文件。查看程序代码:list显示目前执行程序代码前后各五行的程序代码;或是显示从上次 list 之后的程序代码 list function显示该函数开始处前后五行的程序代码。list-上次显示程序代码的前面的十行。21GDB的其他功能until:执行一行程序,若此时程序是在 for/while/do loop 循环的最后一行,则一直执行到循环结束后的第一行程序后停止(until 指令可简写为
10、u)。Finish:执行现行程序到回到上一层程序为止。print(a=10):更改变量值,将变量 a 的值设定为 10。disable:暂停某个断点22更多更详细的资料可以查阅gdb的手册,有需要的同学可以向我索取。23用GDB调试PG首先在安装配置PG时需要加上-enable-debug,如下命令:./configure-enable-debug调试时先用psql连接数据库,然后在psql里执行以下命令得到当前的服务进程pid:Select pg_backend_pid();如果只打开-enable-debug选项,在gdb里进行调试时,会有一些变量的值无法打印出来,这是因为gcc在进行编译
11、代码时,会进行一定程度的优化。为了能够在调试跟踪时看到所有变量的值的变化情况,我们有必要降低甚至取消优化选项:./configure-enable-debug CFLAGS=-o024用GDB调试PG(续)用gdb挂接到刚才的进程上:gdb/usr/local/pgsql/bin/postgres 30979其中/usr/local/pgsql/bin/postgres要替换成 你自己的postgres程序的路径,30979是上 一步中得到的pid。引入源文件:source 源代码目录设置断点gdb里用c继续在psql中执行命令等待gdb运行至断点停住其他和单进程程序调试相同。注意:gdb调试
12、PG时,不能关闭psql与数据库之间的连接25GDB能帮我们跟踪一切吗?26NO!例如initdb的执行过程就很难应用GDB去跟踪,因此GDB能帮我们跟踪95%以上的代码,但是剩余的部分可能还是需要我们用printf去帮助跟踪。其他资源27,有关PG的中文网站,其中还有PG的中文文档(不过版本还停留在8.0)、WIKI等PG的Mail List、Google、Baidu。PG是由C语言写成,但是整个代码包中包含有多个应用程序(postgres、psql、createdb等等),因此对于一个函数,在SI中搜索时会发现有多处定义,在分析时有必要根据头文件之间的引用关系来确定我们需要查看的函数。另外一种方式是可以只把backend文件夹和include文件夹包含在SI的工程中。其他的其他28PG的商业版本,用户包括NTT(日本,NIPPON Telephone and Telegraph)、Sony Online Entertainment(oraclePG)、Utah State University、AIG等谢谢!29