Ted's Blog

Happy coding

gdb使用指南(1)

Ted posted @ 2008年9月05日 04:28 in gdb with tags gdb , 4055 阅读

使用GDB:
   本文描述GDB,GNU的原代码调试器。(这是4.12版1994年一月,GDB版本4。16)
* 目录:
* 摘要:                        GDB的摘要
* 实例:                          一个使用实例
* 入门:                        进入和退出GDB
* 命令:                        GDB 的命令
* 运行:                        在GDB下运行程序
* 停止:                        暂停和继续执行
* 栈:                          检查堆栈
* 原文件:                      检查原文件
* 数据:                        检查数据
* 语言:                        用不同的语言来使用GDB
* 符号:                         检查符号表
* 更改:                         更改执行
* GDB的文件                     文件
* 对象                          指定调试对象
* 控制GDB                       控制
* 执行序列:                    执行一序列命令
* Emacs:                        使GDB和Emacs一起工作
* GDB的bug:
* 命令行编辑:                  行编辑
* 使用历史记录交互:
* 格式化文档:                  如何格式化和打印GDB文档
* 安装GDB :

* 索引:

GDB简介:
**************

   调试器(比如象GDB)能让你观察另一个程序在执行时的内部活动,或程序出错时
发生了什么。
   GDB主要能为你做四件事(包括为了完成这些事而附加的功能),帮助你找出程序
中的错误。
   * 运行你的程序,设置所有的能影响程序运行的东西。

   * 保证你的程序在指定的条件下停止。

   * 当你程序停止时,让你检查发生了什么。

   * 改变你的程序。那样你可以试着修正某个bug引起的问题,然后继续查找另一
     个bug.

   你可以用GDB来调试C和C++写的程序。(参考 *C 和C++)

   部分支持Modula-2和chill,但现在还没有这方面的文档。

   调试Pascal程序时,有一些功能还不能使用。

  GDB还可以用来调试FORTRAN程序,尽管现在还不支持表达式的输入,输出变量,
或类FORTRAN的词法。
* GDB是"free software",大家都可以免费拷贝。也可以为GDB增加新的功能,不
过可要遵守GNU的许可协议幺。反正我认为GNU还是比较不错的:-)
就这句话:
   Fundamentally, the General Public License is a license which says
that you have these freedoms and that you cannot take these freedoms
away from anyone else.
GDB的作者:
   Richard Stallman是GDB的始作俑者,另外还有许多别的GNU的成员。许多人
为此作出了贡献。(都是老外不提也罢,但愿他们不要来找我麻烦:-))

这里是GDB的一个例子:
        原文中是使用一个叫m4的程序。但很遗憾我找不到这个程序的原代码,
所以没有办法来按照原文来说明。不过反正是个例子,我就拿一个操作系统的
进程调度原码来说明把,原代码我会附在后面。
        首先这个程序叫os.c是一个模拟进程调度的原程序(也许是个老古董了:-))。
先说明一下如何取得包括原代码符号的可执行代码。大家有心的话可以去看一下gcc的
man文件(在shell下打man gcc)。gcc -g <原文件.c> -o <要生成的文件名>
-g 的意思是生成带原代码调试符号的可执行文件。
-o 的意思是指定可执行文件名。
(gcc 的命令行参数有一大堆,有兴趣可以自己去看看。)
(忍不住要加个注,现在应该用gcc -ggdb指定吧!因为有很多人都在问,因为除了gdb还有别的工具:-)
反正在linux下把os.c用以上方法编译连接以后就产生了可供gdb使用的可执行文件。
我用gcc -g os.c -o os,产生的可执行文档叫os.
然后打gdb os,就可进入gdb,屏幕提示:
     GDB is free software and you are welcome to distribute copies
      of it under certain conditions; type "show copying" to see
      the conditions.
     There is absolutely no warranty for GDB; type "show warranty"
      for details.

     GDB 4.16, Copyright 1995 Free Software Foundation, Inc...
 (gdb)
  (gdb)是提示符,在这提示符下可以输入命令,直到退出。(退出命令是q/Q)
为了尽量和原文档说明的命令相符,即使在本例子中没用的命令我也将演示。
首先我们可以设置gdb的屏幕大小。键入:
 (gdb)set width 70
就是把标准屏幕设为70列。
  然后让我们来设置断点。设置方法很简单:break或简单打b后面加行号或函数名
比如我们可以在main 函数上设断点:
 (gdb)break main
或(gdb)b main
 系统提示:Breakpoint 1 at 0x8049552: file os.c, line 455.
 然后我们可以运行这个程序,当程序运行到main函数时程序就会停止返回到gdb的
提示符下。运行的命令是run或r(gdb中有不少alias,可以看一下help,在gdb下打help)
run 后面可以跟参数,就是为程序指定命令行参数。
比如r abcd,则程序就会abcd以作为参数。(这里要说明的是可以用set args来指定参
数)。打入r或run后,程序就开始运行直到进入main的入口停止,显示:
Starting program: <路径>/os

Breakpoint 1, main () at os.c:455
455            Initial();
这里455 Initial();是将要执行的命令或函数。
gdb提供两种方式:1.单步进入,step into就是跟踪到函数内啦。命令是step或s
                 2.单步,next,就是简单的单步,不会进入函数。命令是next或n
这两个命令还有别的用法以后再说。
我们用n命令,键入:
(gdb)n
Success forking process# 1 ,pid is 31474

Success forking process# 2 ,pid is 31475

Success forking process# 3 ,pid is 31476

Success forking process# 4 ,pid is 31477

Success forking process# 5 ,pid is 31478

Success forking process# 6 ,pid is 31479

                Dispatching Algorithm : FIFO
********************************************************************************

            PCB#        PID     Priority        PC      State
            1           31474      24            0      WAITING
            2           31475      19            0      WAITING
            3           31476      16            0      WAITING
            4           31477      23            0      WAITING
            5           31478      22            0      WAITING
            6           31479      20            0      WAITING

******************************************************************************

CPU  :  NO process running
IO :  No process
Waiting CPU!!!  31474   31475   31476   31477   31478   31479
Waiting  IO    NONE
456            State=WAITING;
最后的一行就是下一句要执行的命令。我们现在在另一个函数上加断点。注意我们
可以用l/list命令来显示原代码。这里我们键入
(gdb)l
451     main()
452     {
453             int message;
454
455            Initial();
456            State=WAITING;
457            printf("Use Control-C to halt \n");
458            signal(SIGALRM,AlarmMessage);
459            signal(SIGINT,InteruptMessage);
460            signal(SIGUSR2,IoMessage);
(gdb) l
461            alarm(TimeSlot);
462            for(;;)
463             {
464             message=GetMessage();
465                   switch(message)
466                     {
467                             case INTERRUPT :        printf("Use Control-C t;

468                                                     break;
469                             case CHILD_IO:          WaitingIo();
470                                                     break;
显示了原代码,现在在AlarmMessage上加断点。
(gdb) b AlarmMessage
Breakpoint 2 at 0x8048ee3: file os.c, line 259.
(gdb)
然后我们继续运行程序。
(gdb)c
c或continue命令让我们继续被中断的程序。 显示:
Continuing.
Use Control-C to halt

Breakpoint 2, AlarmMessage () at os.c:259
259             ClearSignal();
注意我们下一句语句就是ClearSignal();
我们用s/step跟踪进入这个函数看看它是干什么的。
(gdb) s
ClearSignal () at os.c:227
227             signal(SIGINT,SIG_IGN);
用l命令列出原代码:
(gdb) l
222     }
223
224
225     void ClearSignal()    /* Clear other signals */
226     {
227             signal(SIGINT,SIG_IGN);
228             signal(SIGALRM,SIG_IGN);
229             signal(SIGUSR2,SIG_IGN);
230     }
231
(gdb)
我们可以用s命令继续跟踪。现在让我们来试试bt或backtrace命令。这个命令可以
显示栈中的内容。
(gdb) bt
#0  ClearSignal () at os.c:227
#1  0x8048ee8 in AlarmMessage () at os.c:259
#2  0xbffffaec in ?? ()
#3  0x80486ae in ___crt_dummy__ ()
(gdb)
大家一定能看懂显示的意思。栈顶是AlarmMessage,接下来的函数没有名字--就是
没有原代码符号。这显示了函数调用的嵌套。
好了,我们跟踪了半天还没有检查过变量的值呢。检查表达式的值的命令是p或print
格式是p <表达式>
444444让我们来找一个变量来看看。:-)
(gdb)l 1
还记得l的作用吗?l或list显示原代码符号,l或list加<行号>就显示从<行号>开始的
原代码。好了找到一个让我们来看看WaitingQueue的内容
(gdb) p WaitingQueue
$1 = {1, 2, 3, 4, 5, 6, 0}
(gdb)
WaitingQueue是一个数组,gdb还支持结构的显示,
(gdb) p Pcb
$2 = {{Pid = 0, State = 0, Prior = 0, pc = 0}, {Pid = 31474, State = 2,
    Prior = 24, pc = 0}, {Pid = 31475, State = 2, Prior = 19, pc = 0}, {
    Pid = 31476, State = 2, Prior = 16, pc = 0}, {Pid = 31477, State = 2,
    Prior = 23, pc = 0}, {Pid = 31478, State = 2, Prior = 22, pc = 0}, {
    Pid = 31479, State = 2, Prior = 20, pc = 0}}
(gdb)
这里可以对照原程序看看。
原文档里是一个调试过程,不过我想这里我已经把gdb的常用功能介绍了一遍,基本上
可以用来调试程序了。:-)

运行GDB(一些详细的说明): 
 
  前面已经提到过如何运行GDB了,现在让我们来看一些更有趣的东西。你可以在运行 
GDB时通过许多命令行参数指定大量的参数和选项,通过这个你可以在一开始就设置好 
程序运行的环境。 
  这里将要描述的命令行参数覆盖了大多数的情况,事实上在一定环境下有的并没有 
什么大用处。最通常的命令就是使用一个参数: 
 $gdb <可执行文档名> 
你还可以同时为你的执行文件指定一个core文件: 
 $gdb <可执行文件名> core 
你也可以为你要执行的文件指定一个进程号: 
 $gdb <可执行文件名> <进程号> 如:&gdb os 1234将使gdb与进程1234相联系(attach) 
除非你还有一个文件叫1234的。gdb首先检查一个core文件。 
如果你是使用一个远程终端进行远程调试的话,那如果你的终端不支持的话,你将无法 
使用第二个参数甚至没有core dump。如果你觉得开头的提示信息比较碍眼的话,你可以 
用gdb -silent。你还可以用命令行参数更加详细的控制GDB的行为。 
打入gdb -help或-h 可以得到这方面的提示。所有的参数都被按照排列的顺序传给gdb 
除非你用了-x参数。 
  当gdb开始运行时,它把任何一个不带选项前缀的参数都当作为一个可执行文件或core 
文件(或进程号)。就象在前面加了-se或-c选项。gdb把第一个前面没有选项说明的参数 
看作前面加了-se 选项,而第二个(如果有的话)看作是跟着-c选项后面的。 
  许多选项有缩写,用gdb -h可以看到。在gdb中你也可以任意的把选项名掐头去尾,只 
要保证gdb能判断唯一的一个参数就行。 
在这里我们说明一些最常用的参数选项 
-symbols <文件名>(-s <文件名>)------从<文件名>中读去符号。 
-exec <文件名>(-e <文件名>)----在合适的时候执行<文件名>来做用正确的数据与core 
 dump的作比较。 
-se <文件名>------从<文件名>中读取符号并把它作为可执行文件。 
-core <文件名>(-c <文件名>)--指定<文件名>为一个core dump 文件。 
-c <数字>----连接到进程号为<数字>,与attach命令相似。 
-command <文件名> 
-x <文件名>-----执行gdb命令,在<文件名>指定的文件中存放着一序列的gdb命令,就 
象一个批处理。 
-directory(-d) <路径>---指定路径。把<路径>加入到搜索原文件的路径中。 
-m 
-mapped---- 
   注意这个命令不是在所有的系统上都能用。如果你可以通过mmap系统调用来获得内存 
映象文件,你可以用这个命令来使gdb把你当前文件里的符号写入一个文件中,这个文件 
将存放在你的当前路径中。如果你调试的程序叫/temp/fred那么map文件就叫 
./fred.syms这样当你以后再调试这个程序时,gdb会认识到这个文件的存在,从而从这 
个文件中读取符号,而不是从可执行文件中读取。.syms与主机有关不能共享。 
-r 
-readnow---马上从符号文件中读取整个符号表,而不是使用缺省的。缺省的符号表是 
调入一部分符号,当需要时再读入一部分。这会使开始进入gdb慢一些,但可以加快以后 
的调试速度。 
 
 -m和-r一般在一起使用来建立.syms文件 
 
 
接下来再谈谈模式的设置(请听下回分解 :-)) 
附:在gdb文档里使用的调试例子我找到了在minix下有这个程序,叫m4有兴趣的 
可以自己去看看 
 

模式的选择
--------------
现在我们来聊聊gdb运行模式的选择。我们可以用许多模式来运行gdb,例如在“批模式”
或“安静模式”。这些模式都是在gdb运行时在命令行作为选项指定的。
`-nx'
`-n'
     不执行任何初始化文件中的命令。(一般初始化文件叫做`.gdbinit').一般情况下在
这些文件中的命令会在所有的命令行参数都被传给gdb后执行。

`-quiet'
`-q'
     “安静模式”。不输出介绍和版权信息。这些信息在“批模式”中也被跳过。

`-batch'
     “批模式”。在“批模式”下运行。当在命令文件中的所有命令都被成功的执行后
     gdb返回状态“0”,如果在执行过程中出错,gdb返回一个非零值。
     “批模式”在把gdb作为一个过滤器运行时很有用。比如在一台远程计算机上下载且
     执行一个程序。信息“ Program exited normally”(一般是当运行的程序正常结束
     时出现)不会在这种模式中出现。
`-cd DIRECTORY'
     把DIRECTORY作为gdb的工作目录,而非当前目录(一般gdb缺省把当前目录作为工作目
     录)。
`-fullname'
`-f'
     GNU Emacs 设置这个选项,当我们在Emacs下,把gdb作为它的一个子进程来运行时,
     Emacs告诉gdb按标准输出完整的文件名和行号,一个可视的栈内容。这个格式跟在
     文件名的后面。行号和字符重新按列排,Emacs-to-GDB界面使用\032字符作为一个
     显示一页原文件的信号。
`-b BPS'
     为远程调试设置波特率。

`-tty DEVICE'
     使用DEVICE来作为你程序的标准输入输出

`quit'
     使用'quit'命令来退出gdb,或打一个文件结束符(通常是' CTROL-D')。如果
     你没有使用表达式,gdb会正常退出,否则它会把表达式的至作为error code
     返回。

     一个中断(通常是'CTROL-c)不会导致从gdb中退出,而是结束任何一个gdb的命
     令,返回gdb的命令输入模式。一般在任何时候使用'CTROL-C'是安全的,因为
     gdb会截获它,只有当安全时,中断才会起作用。
     如果你正在用gdb控制一个被连接的进程或设备,你可以用'detach'命令来释放
     它。

Shell命令
==============
    当你偶尔要运行一些shell命令时,你不必退出调试过程,也不需要挂起它;你
    可以使用'shell'命令。

`shell COMMAND STRING'
     调用标准shell来执行'COMMAND STRING'.环境变量'SHELL'决定了那个shell被
     运行。否则gdb使用'/bin/sh'.
     'make'工具经常在开发环境中使用,所以你可以不用'shell'命令而直接打'make'

`make MAKE-ARGS'
     用指定的命令行变量来运行'make'程序,这等于使用'shell make MAKE-ARGS'
GDB 命令
************
   我们可以把一个gdb命令缩写成开头几个字母,如果这没有二意性你可以直接回车来
   运行。你还可以使用TAB键让gdb给你完成接下来的键入,或向你显示可选择的命令,
   如果有不止一个选择的话。

Command语法
==============

   一个gdb命令是一个单行的输入。长度没有限制。它一个命令开头,后面可以跟参量。
   比如命令'step'接受一个参量表示单步执行多少步。你也可以不用参量。有的命令
   不接受任何参量。

   gdb命令只要没有二意性的话就可以被缩写。另外一些缩写作为一个命令列出。在某些
   情况下二意也是允许的。比如's'是指定'step'的缩写,但还有命令'start'。你可以把
   这些缩写作为'help'命令的参量来测试它们。
   空行(直接回车)表示重复上一个命令。但有些命令不能重复比如象'run',就不会以这
   种方式重复,另外一些当不小心重复会产生严重后果的命令也不能用这种方法重复。
   'list'和'x'命令当你简单的打回车时,会建立新的变量,而不是简单的重复上一个命
   令。这样你可以方便的浏览原代码和内存。
   gdb还有一种解释RET的方法:分割长输出。这种方法就和'more'命令相似。由于这时经
   常会不小心多打回车,gdb将禁止重复当一个命令产生很长的输出时。
   任何用'#'开头一直到行尾的命令行被看作是注释。主要在命令文件中使用。

输入命令的技巧
==================
   前面已经提到过TAB键的使用。使用TAB键能让你方便的得到所要的命令。比如
在gdb中:
   (gdb)info bre <TAB>(键入info bre,后按TAB键)
   gdb能为你完成剩下的输入。它还能萎蔫提供选择的可能性。如果有两个以上可
能的话,第一次按<TAB>键,gdb会响铃提示,第二次则显示可能的选择。同样gdb
也可以为一些子命令提供快速的访问。用法与上相同。
  上例中显示
   (gdb)info breakepoints
   你也可以直接打回车,gdb就将你输入的作为命令的可能的缩写。来判断执行。
如果你打入的缩写不足以判断,那么gdb会显示一个列表,列出可能的命令。同样的
情况对于命令的参数。在显示完后gdb把你的输入拷贝到当前行以便让你继续输入。
   如果你只想看看命令的列表或选项,你可以在命令行下打M-?(就是按着ESC键
同时按SHIFT和?键)。你可以直接在命令行下打试试。
  (gdb)<M-?>
   gdb会响铃并显示所有的命令。不过这种方式好象在远程调试是不行。当有的命令
使用一个字符串时,你可以用" ' "将其括起来。这种方法在调试C++程序时特别有用。
因为C++支持函数的重载。当你要在某个有重载函数上设断点时,不得不给出函数参数
以区分不同的重载函数。这时你就应该把整个函数用" ' "括起来。比如,你要在一个
叫name的函数上设断点,而这个函数被重载了(name(int)和name(float))。你将不得
不给出参变量以区分不同的函数。使用'name(int)'和'name(float)'。这里有个技巧,
你可以在函数名前加一个" ' "符号。然后打M-?.

你可以使用help命令来得到gdb的在线帮助。

`help'
`h'
      你可以使用help或h后面不加任何参数来得到一个gdb命令类的列表。

          (gdb) help
          List of classes of commands:

          running -- Running the program
          stack -- Examining the stack
          data -- Examining data
          breakpoints -- Making program stop at certain points
          files -- Specifying and examining files
          status -- Status inquiries
          support -- Support facilities
          user-defined -- User-defined commands
          aliases -- Aliases of other commands
          obscure -- Obscure features

          Type "help" followed by a class name for a list of
          commands in that class.
          Type "help" followed by command name for full
          documentation.
          Command name abbreviations are allowed if unambiguous.
          (gdb)

`help CLASS'
     使用上面列出的help class作为help或h的参量,你可以得到单一的命令列表。
     例如显示一个'status'类的列表。

          (gdb) help status
          Status inquiries.

          List of commands:

          show -- Generic command for showing things set
           with "set"
          info -- Generic command for printing status

          Type "help" followed by command name for full
          documentation.
          Command name abbreviations are allowed if unambiguous.
          (gdb)

`help COMMAND'
     详细列出单个命令的资料。

`complete ARGS'
     列出所有以ARGS开头的命令。例如:

          complete i

     results in:

          info
          inspect
          ignore

     This is intended for use by GNU Emacs.

   除了使用'help'你还可以使用gdb的命令'info'和'show'来查询你程序的
状态,每个命令可以查询一系列的状态。这些命令以恰当的方式显示所有的
子命令。

`info'
     此命令(可以缩写为'i')用来显示你程序的状态。比如,你可以使用info
args 列出你程序所接受的命令行参数。使用info registers列出寄存器的状态。
或用info breakpoint列出在程序中设的断点。要获得详细的关于info的信息打
help info.
`set'
     这个命令用来为你的程序设置一个运行环境(使用一个表达式)。比如你
可以用set prompt $来把gdb的提示符设为$.

`show'
     与'info'相反,'show'命令用来显示gdb自身的状态。你使用'set'命令来
可以改变绝大多数由'show'显示的信息。比如使用show radix命令来显示基数。
用不带任何参变量的'set'命令你可以显示所有你可以设置的变量的值。
有三个变量是不可以用'set'命令来设置的。
`show version'
     显示gdb的版本号。如果你发现gdb有bug的话你应该在bug-reports里加
入gdb的版本号。

`show copying'
显示版权信息。

`show warranty'
显示担保信息。
在gdb下运行你的程序
**************************
   当你在gdb下运行程序时,你必须先为gdb准备好带有调试信息的可执行文档。
还可以在gdb中为你的程序设置参变量,重定向你程序的输入/输出,设置环境变
量,调试一个已经执行的程序或kill掉一个子进程。
   这里许多内容在早先的例子中都已经用到过,可以参见gdb(二)。
目录:

* 编译::                        为调试编译带调试信息的代码
* 运行::                        运行你的程序
* 参变量::                      为你的程序设置参变量
* 运行环境::                    为你的程序设置运行时环境
* 设置工作目录::                在gdb中设置程序的工作目录。
* 输入/输出::                   设定你程序的输入和输出
* 连接::                        调试一个已经运行的程序
* 结束子进程::                  Kill子进程
* 进程信息::                    附加的进程信息
* 线程::                        调试带多线程的程序
* 多进程::                   调试带多进程的程序
为调试准备带调试信息的代码
===========================
   为了高效的调试一个程序,你需要使用编译器来产生附带调试信息的可执行代码
这些调试信息存储在目标文件中;描述了变量数据类型和函数声明,在原文件代码行
和执行代码之间建立联系。
   为产生调试信息,当你使用编译器时指定'-g'选项,就可以为你的程序产生带有
调试信息的可执行代码。
   有些c编译器不支持'-g'选项和'-O'选项,那你就有麻烦了,或者有别的方法产生
带调试信息的可执行代码,要不就没办法了。
   gcc,GNU的c语言编译器支持'-g'和'-O'选项。这样你就可以产生带调试信息的且
优化过的可执行代码.
   当你使用gdb来调试一个使用'-g','-O'选项产生的程序时,千万记住编译器为了优
化你的程序重新安排了你的程序。不要为运行次序与你原来设想的不同,最简单的例子
就是当你定义了一个变量但从未使用过它时,gdb中是看不到这个变量的--因为它已经
被优化掉了。
   所以有时你不要使用'-O'选项,如果当你不用优化时产生的程序是正确的,而优化
过后变的不正确了,那么这是编译器的bug你可以向开发者提供bug-reports(包括出错
的例子)。
   早期的GUN C语言编译器允许'-gg'选项,也用来产生调试信息,gdb不再支持这种格
式的调试信息,如果你的编译器支持'-gg'选项,请不要使用它。

`run'
`r'
     使用'run'命令在gdb下启动你的程序。你必须先指定你程序的名字(用gdb的命令行
参数)或使用'file'命令,来指定文件名。如果你在一个支持多进程的环境下运行你的程
序'run'命令创建一个子进程然后加载你的程序。如果环境不支持进程,则gdb直接调到
程序的第一条命令。
   一些父进程设置的参量可以决定程序的运行。gdb提供了指定参量的途径,但你必须
在程序执行前设置好他们。你也可以在运行过程中改变它们,但每次改变只有在下一次
运行中才会体现出来。这些参量可以分为四类:
---参数
     你可以在使用'run'命令时设置,如果shell支持的话,你还可以使用通配符,或
变量代换。在UNIX系统中你可以使用'shell环境变量'来控制shell。
---环境:
     你的程序一般直接从gdb那里继承环境变量。但是你可以使用'set environment'
命令来设置专门的环境变量。
---工作目录
     你的程序还同时从gdb那里继承了工作目录,你可以使用'cd'命令在gdb中改变工作
目录。
---标准输入/输出
     你的程序一般使用与gdb所用的相似的设备来输入/输出。不过你可以为你的程序的
输入/输出进行重定向。使用'run'或'tty'命令来设置于gdb所用不同的设备。
*注意:当你使用输入/输出重定向时,你将不能使用无名管道来把你所调试的程序的输出
传给另一个程序。这样gdb会认为调试程序出错。
   当你发出'run'命令后,你的程序就开始运行。
   如果你的符号文件的时间与gdb上一次读入的不同,gdb会废弃原来的符号表并重新读
入。当前的断点不变。

Avatar_small
Robinjack 说:
2020年12月18日 03:53

I have prepared this updated practice exam with answers! 50 questions with answers. It will help you succeed in this certification exam tutorial spring

Avatar_small
Robinjack 说:
2020年12月21日 20:28

You really should experience a tournament for starters of the finest blogs online. Let me recommend this great site! www.transducertechniques.com

Avatar_small
sameer 说:
2020年12月27日 14:26

Hey there just stoppin by. Good site you got, keep it going. If you happen to be interested in how to make a beat and have heard about DubTurbo, check out the press release. https://app.site123.com/blog/rouletteonline88?w=4647222

Avatar_small
Robinjack 说:
2020年12月28日 22:23

Hiya! awesome blog! I happen to be a daily visitor to your site (somewhat more like addict ) of this website. Just wanted to say I appreciate your blogs and am looking forward for more to come! buy crystal meds online

Avatar_small
퍼스트카지노 说:
2021年1月06日 15:42

Hiya! awesome blog! I happen to be a daily visitor to your site (somewhat more like addict ) of this website. Just wanted to say I appreciate your blogs and am looking forward for more to come!

Avatar_small
Robinjack 说:
2021年1月08日 19:27

Many thanks for creating the effort to talk about this, I feel strongly about this and enjoy learning a great deal more on this subject. If feasible, as you gain knowledge, would you mind updating your webpage with a great deal more info? It’s very useful for me. Ross Levinsohn profile

Avatar_small
Robinjack 说:
2021年1月08日 19:27

most toddlers love cute teddys as their first toddler toys, my son also loves them a lot,. Ross Levinsohn CEO

Avatar_small
Robinjack 说:
2021年1月08日 19:27

construction jobs are on the rise again these days because the recession is almost over** Ross Levinsohn profile

Avatar_small
Robinjack 说:
2021年1月08日 19:27

i am amazed how cheap broadband internet is during these year, isps have some promo too. Maven Sports Illustrated

Avatar_small
안전놀이터 说:
2021年1月17日 20:10

Black Ops Zombies… [...]some people still have not played this game. It’s hard to imagine or believe, but yes, some people are missing out on all of the fun.[...]…

Avatar_small
전설 서구 说:
2021年1月21日 20:30

Hello I am so delighted I located your blog, I really located you by mistake, while I was watching on google for something else, Anyways I am here now and could just like to say thank for a tremendous post and a all round entertaining website. Please do keep up the great work. 123 movie

Avatar_small
ASTHMA FROM ALLERGIE 说:
2021年1月27日 18:58

Hiya! awesome blog! I happen to be a daily visitor to your site (somewhat more like addict ) of this website. Just wanted to say I appreciate your blogs and am looking forward for more to come!

Avatar_small
forex trading signal 说:
2021年1月28日 20:54

The information you provided here are extremely precious. It been found a real pleasurable surprise to obtain that watching for me once i woke up today. They can be constantly to the issue as well as simple to be aware of. Thanks quite a bit for any valuable ideas you’ve got shared here.

Avatar_small
Daniel Gordon Reddit 说:
2021年1月30日 19:50

You really should experience a tournament for starters of the finest blogs online. Let me recommend this great site!

Avatar_small
Daniel Gordon street 说:
2021年1月30日 19:51

Thanks for the sensible critique. Me and my neighbor were just preparing to do some research about this. We got a grab a book from our area library but I think I learned more from this post. I’m very glad to see such fantastic info being shared freely out there.

Avatar_small
Daniel Gordon GLD Pa 说:
2021年1月30日 19:51

I am not very great with English but I line up this very easy to translate.

Avatar_small
Daniel Gordon info 说:
2021年1月30日 19:51

I’ll right away grab your rss feed as I can not find your e-mail subscription link or e-newsletter service. Do you have any? Kindly let me know so that I could subscribe. Thanks.

Avatar_small
Daniel Gordon course 说:
2021年1月30日 19:51

Thanks for your submission. Another item is that just being a photographer includes not only problems in catching award-winning photographs but in addition hardships in establishing the best video camera suited to your needs and most especially struggles in maintaining the quality of your camera. This can be very true and obvious for those photography enthusiasts that are directly into capturing the nature’s eye-catching scenes : the mountains, the actual forests, the actual wild or even the seas. Going to these amazing places surely requires a digicam that can surpass the wild’s hard conditions.

Avatar_small
Ross Levinsohn 说:
2021年1月30日 19:52

before you buy some very expensive SEO Tools, always look for a review first before you invest on them“

Avatar_small
Ross Levinsohn Maven 说:
2021年1月30日 21:31

Hiya! awesome blog! I happen to be a daily visitor to your site (somewhat more like addict ) of this website. Just wanted to say I appreciate your blogs and am looking forward for more to come!

Avatar_small
best cbd for pain 说:
2021年2月07日 17:43

The information you provided here are extremely precious. It been found a real pleasurable surprise to obtain that watching for me once i woke up today. They can be constantly to the issue as well as simple to be aware of. Thanks quite a bit for any valuable ideas you’ve got shared here.

Avatar_small
Robinjack 说:
2021年2月17日 21:44

When I initially commented I clicked the -Notify me when new comments are added- checkbox and now each time a remark is added I get four emails with the same comment. Is there any manner you possibly can take away me from that service? Thanks! deer fence gate

Avatar_small
Robinjack 说:
2021年2月23日 04:44

hi!,I like your writing so much! share we communicate more about your article on AOL? I require an expert on this area to solve my problem. Maybe that’s you! Looking forward to see you. schlüsseldienst kosten

Avatar_small
smm panel 说:
2021年2月23日 18:49

The information you provided here are extremely precious. It been found a real pleasurable surprise to obtain that watching for me once i woke up today. They can be constantly to the issue as well as simple to be aware of. Thanks quite a bit for any valuable ideas you’ve got shared here.

Avatar_small
maxbet 说:
2021年4月07日 18:18

I am typically to blogging and i genuinely appreciate your content. The content has really peaks my interest. I will bookmark your site and maintain checking for new data.

Avatar_small
Robinjack 说:
2021年4月24日 21:12

Shania Twain for me is the best country music singer of all times, I also like Taylor Swift but nothing will beat Shania Twain., Monthly Income Review

Avatar_small
Monero Pool 说:
2021年5月16日 22:28

well, if you really want to be healthy, i believe that veggan foods are the best ‘

Avatar_small
alex 说:
2021年5月23日 00:38 I believe one of your adverts triggered my internet browser to resize, you might want to put that on your blacklist. <a href="https://buffalowrites.com">creative writer</a>

 

Avatar_small
alex 说:
2021年5月23日 00:43

nicotine can really make you an addict, stay away from cigarettes in the first place.. topics to write about

Avatar_small
trimming japanese ma 说:
2021年5月26日 13:21

There a few fascinating points in time in this post but I don’t know if I see these center to heart. There may be some validity but I’ll take hold opinion until I explore it further. Excellent article , thanks and then we want a lot more! Put into FeedBurner too

Avatar_small
alex 说:
2021年5月31日 20:29

I am glad for commenting to let you be aware of of the outstanding experience my wife’s princess encountered reading your site. She came to find plenty of issues, with the inclusion of how it is like to possess an excellent teaching mood to have a number of people very easily fully grasp specific specialized things. You actually did more than our own desires. Many thanks for displaying the powerful, trustworthy, edifying and as well as easy tips about your topic to Ethel. togel online

Avatar_small
777 说:
2021年6月03日 18:01

Ich bin sehr froh, auf diese Online Casino Website gestoßen zu sein <a href=""></a>. Einige der besten Spielerlebnisse, die ich je hier hatte.

Avatar_small
villas phuket 说:
2021年6月20日 13:16

Many thanks for posting this, It?s just what I was researching for on bing. I?d so much comparatively hear opinions from a person, barely than an organization internet page, that?s why I like blogs so significantly. Many thanks!

Avatar_small
港区の高級マンション 说:
2021年6月21日 20:39

After study many of the web sites for your website now, we genuinely much like your way of blogging. I bookmarked it to my bookmark website list and will also be checking back soon. Pls consider my internet site too and inform me what you think.

Avatar_small
Pg slot ทดลองเล่น 说:
2021年6月27日 15:20

I conceive this website has got some real great information for everyone : D.

Avatar_small
Robinjack 说:
2021年6月27日 17:27

It’s rare knowledgeable individuals about this topic, and you could be seen as what happens you are talking about! Thanks The Simplest Baccarat Strategy

Avatar_small
pragmatic 说:
2021年6月28日 19:46

Excellently written article, doubts all bloggers offered the same content because you, the internet is a greater place. Please keep it up!

Avatar_small
Robinjack 说:
2021年6月29日 19:18

I don’t even know how I ended up right here, but I believed this submit used to be great. I don’t understand who you’re however certainly you are going to a famous blogger should you are not already Cheers! Slotxo

Avatar_small
Pg slot ทดลองเล่น 说:
2021年6月30日 15:18

Substantially, this publish is really the sweetest on this notable theme. I harmonise along with your conclusions and will thirstily seem ahead in your incoming updates. Stating thanks will not likely just be ample, for that phenomenal clarity with your writing. I will right grab your rss feed to stay informed of any updates. Admirable operate and considerably accomplishment with your enterprise dealings! Please excuse my poor English as it’s not my very first tongue.

Avatar_small
Robinjack 说:
2021年7月01日 20:02

Youre so cool! I dont suppose Ive read anything similar to this prior to. So nice to uncover somebody with many original applying for grants this subject. realy appreciation for starting this up. this fabulous website is one area that is required on-line, someone with a bit of originality. useful project for bringing new things to the world wide web! How to Gain Baccarat

Avatar_small
Buy 6-APB 说:
2021年7月04日 22:27

i like wireless internet because you can surf anywhere and you can avoid those ethernet cables::

Avatar_small
smith 说:
2021年7月05日 18:40

you are in point of fact a just right webmaster. The site loading velocity is incredible. It kind of feels that you are doing any unique trick. Also, The contents are masterpiece. you’ve performed a fantastic activity on this topic! Early Vixen

Avatar_small
Robinjack 说:
2021年7月11日 22:16

You made some decent points there. I looked on the net for any issue and found most individuals goes in addition to with all your website. read more

Avatar_small
WWW 说:
2021年7月14日 16:34

Hi. best wishes to you and your very nice blog” CBD gummies reviewed by CFAH.org

Avatar_small
gewinn spielautomate 说:
2021年7月18日 16:56

Neue Spiele sind eine aufregende Ergänzung für jedes Casino und manchmal mit großartigen Aktionen und Angeboten verbunden, wie z. B. Bonus-Spins und Aufladungen von Gratisgeldern. Ich fand dieses großartige Online Casino mit einigen großartigen Spielen namens gewinn spielautomaten. Sie sind wirklich einen Besuch wert.

Avatar_small
WWW 说:
2021年7月19日 18:07

Hi. best wishes to you and your very nice blog” is cbd oil good for arthritis

Avatar_small
Robinjack 说:
2021年7月29日 19:13

I do not know if it’s just me or if everyone else encountering issues with your site. It appears as if some of the written text within your content are running off the screen. Can somebody else please comment and let me know if this is happening to them as well? This might be a problem with my browser because I’ve had this happen before. Cheers günstige büros

Avatar_small
WWW 说:
2021年7月31日 17:19

Wonderful paintings! That is the kind of information that are meant to be shared across the web. Disgrace on the seek for no longer positioning this submit upper! Come on over and visit my website . Thanks =)https://letterboxd.com/williambutler12/

Avatar_small
Robinjack 说:
2021年8月01日 18:16

Hi! Great post! Please do tell us when I will see a follow up! early vixen

Avatar_small
Robinjack 说:
2021年8月02日 17:53

My spouse and I absolutely love your blog and find a lot of your post’s to be just what I’m looking for. Do you offer guest writers to write content for you? I wouldn’t mind writing a post or elaborating on a number of the subjects you write related to here. Again, awesome blog! visit my site ex girlfriends free viagra samples

Avatar_small
Robinjack 说:
2021年8月07日 23:01

Thank you for making the honest attempt to discuss this. I feel very strong about it and would like to learn more. If it’s OK, as you gain extra in depth knowledge, might you mind adding more articles very similar to this one with more information? It would be extraordinarily useful and useful for me and my friends. natrium pentobarbital kaufen

Avatar_small
Robinjack 说:
2021年8月07日 23:01

I like the helpful info you provide in your articles. I will bookmark your blog and check again here regularly. I am quite sure I will learn plenty of new stuff right here! Good luck for the next! zuverlässige Nembutal-Lieferanten

Avatar_small
Robinjack 说:
2021年8月07日 23:02

Hi there, I just found your site and wanted to say that I’ve truly enjoyed browsing your blog posts. After all I’ll be subscribing to your feed and I hope you write again very soon! pentobarbital kaufen österreich

Avatar_small
Robinjack 说:
2021年8月07日 23:02

Extraordinary work right here. We in reality enjoyed what you had to say. buy 1p-lsd

Avatar_small
Robinjack 说:
2021年8月07日 23:02

I have read several good stuff here. Definitely worth bookmarking for revisiting. I surprise how much effort you put to create such a wonderful informative web site. dank vapes 2021

Avatar_small
Robinjack 说:
2021年8月12日 19:46

Hi, Neat post. There’s a problem with your website in internet explorer, would test this… IE still is the market leader and a big portion of people will miss your fantastic writing because of this problem. login sbobet

Avatar_small
Robinjack 说:
2021年8月19日 19:42

Okay, re-read that same statement but this time the drug has now changed to cannabis. tko carts

Avatar_small
Robinjack 说:
2021年8月22日 18:20

Hello! I simply want to make a enormous thumbs up with the wonderful info you’ve here during this post. We are returning to your blog for additional soon. cenforce 200 mg

Avatar_small
WWW 说:
2021年8月26日 20:35

sony music would be the biggest company in entertainment from what i see in the future. they have a good business plan,,https://www.forbes.com/sites/garrettgunderson/2016/11/01/how-virtual-summits-are-helping-entrepreneurs-generate-leads-authority-and-revenue/?sh=65df62356367

Avatar_small
laim 说:
2021年8月30日 02:26

Took me time to read all the comments, but I really enjoyed the article. It proved to be Very helpful to me and I am sure to all the commenters here! It’s always nice when you can not only be informed, but also entertained!EMF Protection

Avatar_small
alex 说:
2021年9月01日 02:39

I’ve recently started a site, the information you offer on this web site has helped me greatly. Thank you for all of your time & work. casino online

Avatar_small
alex 说:
2021年9月01日 02:39

*An interesting discussion is worth comment. I think that you should write more on this topic, it might not be a taboo subject but generally people are not enough to speak on such topics. To the next. Cheers slots

Avatar_small
alex 说:
2021年9月01日 02:39

Hi, you used to write excellent articles, but the last several posts have been kinda boring… I miss your tremendous posts. Past few posts are just a little out of track! Casino en ligne

Avatar_small
alex 说:
2021年9月01日 02:39

I like what you guys are up too. Such intelligent work and reporting! Keep up the excellent works guys I’ve incorporated you guys to my blogroll. I think it will improve the value of my web site cresus casino

Avatar_small
alex 说:
2021年9月01日 02:39

Howdy sir, you have a really nice blog layout “    bonus de bienvenue

Avatar_small
Robinjack 说:
2021年9月04日 21:08

If you read this article all the way through, perhaps the marijuana smoker's rationalizations have resonated with you in some way. I could identify with all of them at some stage in my cannabis dependency. Weed smokers and ex-weed smokers as well could easily include many more rationalizations to the list. What's important to understand is that these are rationalizations, not sound reasons. marijuana online store

Avatar_small
WWW 说:
2021年9月07日 19:15

Thanks for making the trustworthy attempt to discuss this. I believe very strong approximately it and would like to learn more. If it’s OK, as you achieve extra extensive knowledge, may you mind including more articles very similar to this one with more information? It might be extraordinarily helpful and helpful for me and my friends.Pole dancers

Avatar_small
Robinjack 说:
2021年9月10日 19:40

Typewriter… […]It needs to become ironed with low setting right up until the graphic is entirely transferred towards the ribbon[…]… sbobet88

Avatar_small
WWW 说:
2021年9月19日 18:53

Thanks for making the trustworthy attempt to discuss this. I believe very strong approximately it and would like to learn more. If it’s OK, as you achieve extra extensive knowledge, may you mind including more articles very similar to this one with more information? It might be extraordinarily helpful and helpful for me and my friends.Wohnungsauflösung Berlin

Avatar_small
WWW 说:
2021年10月12日 15:31

Finance Payment Calculator A course to find just how much and exactly how often your compensation will probably be. Examine choices and buy one that is certainly adequate for you.Chauffeur to Manchester Airport

Avatar_small
COOK 说:
2022年1月24日 20:45

This was a really great contest and hopefully I can attend the next one. It was alot of fun and I really enjoyed myself.. 토토커뮤니티

Avatar_small
virus 说:
2022年2月20日 19:52

I visit your blog regularly and recommend it to all of those who wanted to enhance their knowledge with ease. The style of writing is excellent and also the content is top-notch. Thanks for that shrewdness you provide the readers! write my essay for me

Avatar_small
virus 说:
2022年2月22日 16:30

This is a good post. This post gives truly quality information. I’m definitely going to look into it. Really very useful tips are provided here. Thank you so much. Keep up the good works. top 8 best natural foods for dogs for shiny healthy fur

Avatar_small
. 카지노사이트 说:
2022年2月25日 04:30

Your content is nothing short of bright in many forms. I think this is friendly and eye-opening material. I have gotten so many ideas from your blog. Thank you so much. Telephonic Interpreters

Avatar_small
. 카지노사이트 说:
2022年3月11日 00:29 This is my first time visit here. From the tons of comments on your articles,I guess I am not only one having all the enjoyment right here! best valorant coaching
Avatar_small
. 카지노사이트 说:
2022年3月22日 02:54

Thank you so much as you have been willing to share information with us. We will forever admire all you have done here because you have made my work as easy as ABC. ดูหนัง

Avatar_small
COOK 说:
2022年5月12日 04:59

I gotta favorite this website it seems very helpful . 토토사이트

Avatar_small
HASEEB 说:
2022年6月27日 21:15 Thanks for sharing this information. I really like your blog post very much. You have really shared a informative and interesting blog post with people.. fbisd skyward
Avatar_small
. 카지노사이트 说:
2022年8月19日 00:18

I’ve been surfing online more than three hours today, yet I never found any interesting article like yours. It’s pretty worth enough for me. In my opinion, if all webmasters and bloggers made good content as you did, the web will be a lot more useful than ever before. obtenir plus d'informations

Avatar_small
. 카지노사이트 说:
2022年9月20日 03:29

Good post but I was wondering if you could write a litte more on this subject? I’d be very thankful if you could elaborate a little bit further. Appreciate it! Bitdeer

Avatar_small
. 카지노사이트 说:
2022年11月28日 03:24

Yes i am totally agreed with this article and i just want say that this article is very nice and very informative article.I will make sure to be reading your blog more. You made a good point but I can't help but wonder, what about the other side? !!!!!!Thanks lentor hills residences


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter