FreeBSD下GDB调试
GDB调试简易教程

设置断点(break point)
`break ... if COND` 条件断点,当表达式COND非零时程序在断 点停止 例如`break 253 if i=10` `tbreak …` 设置一个只会停止一次的断点
设置观察点(watch point)
`watch EXPR` 为EXPR设置一个观察点,一旦EXPR被写入并发生变化,程 序停止 `rwatch EXPR` EXPR被读取时,程序停止 `awatch EXPR` EXPR被读取或者被写入时,程序停止 当程序运行到EXPR作用域以外的地方时,GDB将会自动删 除此观察点,如果想继续观察,必须重新设置观察点。
启动:
最通常的命令就是使用一个参数: $(m68k-linux-)gdb <可执行文档名> 你还可以同时为你的执行文件指定一个core文件: $gdb <可执行文件名> core 你也可以为你要执行的文件指定一个进程号:
$gdb <可执行文件名> <进程号>
常用启动参数:
-symbols <文件名>(-s <文件名>) 从<文件名>中读去符号 -x <文件名> 执行gdb命令,在<文件名>指定的文件中存放着一序列的gdb 命令,就象一个批处理 -directory(-d) <路径> 指定路径。把<路径>加入到搜索源文件的路径中
程序的恢复与单步调试
finish 运行程序,直到当前函数完成并返回,打印函数返回时的堆 栈地址和返回值及参数值等信息 until [location] 简写为u,继续运行程序直至跳出当前正在单步调试的循环体; 加参数表示继续运行到代码的location处或者当前stack frame返回
实例—使用gdb调试器

2.4 实例—使用gdb调试器1.编写实例程序gcctest.c,见2.2小节的开头部分2.编译3.启动GDB,执行程序启动gdb,进入gdb调试环境,可以使用gdb的命令对程序进行调试。
[root@localhost gdbtest txt]# gdb //启动gdbGNU gdb Fedora (6.8-27.el5)Copyright (C) 2008 Free Software Foundation, Inc.License GPLv3+: GNU GPL version 3 or later </licenses/gpl.html>This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law. Type "show copying"and "show warranty" for details.This GDB was configured as "i386-redhat-linux-gnu".(gdb) run gcctest //在gdb中,运行程序使用r或是run命令,注意,gcctest没有调试信息Starting program: gcctestNo executable file specified.Use the "file" or "exec-file" command. //要使用file或exec-file命令指出要运行的程序(gdb) file gcctest //使用file命令指出要运行的程序gcctest,注意,对gdb命令也可以使用Tab gcctest gcctest.c gcctestg(gdb) file gcctest //使用file命令指出要运行的程序gcctestReading symbols from /root/Desktop/gdbtest txt/gcctest...(no debugging symbols found)...done.(gdb) r //在gdb中,运行程序使用r或是run命令Starting program: /root/Desktop/gdbtest txt/gcctest gcctest(no debugging symbols found)(no debugging symbols found)(no debugging symbols found)hello in mainhello 1hello 2sum=54125560035401396161080590579269632.000000Program exited with code 057.(gdb) file gcctestg //使用file命令指出要运行的程序gcctestgReading symbols from /root/Desktop/gdbtest txt/gcctestg...done.(gdb) r //在gdb中,运行程序使用r或是run命令Starting program: /root/Desktop/gdbtest txt/gcctestg gcctesthello in mainhello 1hello 2sum=54125560035401396161080590579269632.000000Program exited with code 057.(gdb) q //使用q或是quit命令退出gdb[root@localhost gdbtest txt]#4.GDB命令简介support -- Support facilitiestracepoints -- Tracing of program execution without stopping the programuser-defined -- User-defined commandsType "help" followed by a class name for a list of commands in that class.Type "help all" for the list of all commands.Type "help" followed by command name for full documentation.Type "apropos word" to search for commands related to "word".Command name abbreviations are allowed if unambiguous.(gdb) help files //使用help <class>命令查看files类中的命令Specifying and examining files.List of commands:add-shared-symbol-files -- Load the symbols from shared objects in the dynamic linker's link mapadd-symbol-file -- Load symbols from FILEadd-symbol-file-from-memory -- Load the symbols out of memory from a dynamically loaded object filecd -- Set working directory to DIR for debugger and program being debuggedcore-file -- Use FILE as core dump for examining memory and registersdirectory -- Add directory DIR to beginning of search path for source filesedit -- Edit specified file or functionexec-file -- Use FILE as program for getting contents of pure memoryfile -- Use FILE as program to be debuggedforward-search -- Search for regular expression (see regex(3)) from last line listedgenerate-core-file -- Save a core file with the current state of the debugged processlist -- List specified function or lineload -- Dynamically load FILE into the running programnosharedlibrary -- Unload all shared object library symbolspath -- Add directory DIR(s) to beginning of search path for object filespwd -- Print working directoryremote -- Manipulate files on the remote systemremote delete -- Delete a remote fileremote get -- Copy a remote file to the local systemremote put -- Copy a local file to the remote system---Type <return> to continue, or q <return> to quit--- //一屏显示不完,敲回车键显示后面的内容reverse-search -- Search backward for regular expression (see regex(3)) from last line listedsearch -- Search for regular expression (see regex(3)) from last line listedsection -- Change the base address of section SECTION of the exec file to ADDRsharedlibrary -- Load shared object library symbols for files matching REGEXPsymbol-file -- Load symbol table from executable file FILEType "help" followed by command name for full documentation.Type "apropos word" to search for commands related to "word".Command name abbreviations are allowed if unambiguous.(gdb)5.显示源代码(gdb) file gcctestg //使用file命令指出要运行的程序gcctestgLoad new symbol table from "/root/Desktop/gdbtest txt/gcctestg"? (y or n) yReading symbols from /root/Desktop/gdbtest txt/gcctestg...done.(gdb) list //显示当前行后面的源程序1 #include <stdio.h>23 void print_hello1(char *p_str);4 void print_hello2(char *p_str);56 int main(int argc,char **argv)7 {8 double i,sum=0;9 char *pstr="hello in main";10 int arr[]={1,2,3,4,5};(gdb) list //显示当前行后面的源程序11 printf("%s\n",pstr);12 print_hello1("hello 1");13 print_hello2("hello 2");1415 for(i=1; i<=1020000020.01*1020000020.01*10100020.01*10100020.00202; i=i*1.0000016)16 sum=sum/1.0201809902203*1.000102101203*1.00006605+i*10.01016/1.0005;17 printf("sum=%f\n",sum);18 }1920 void print_hello1(char *p_str)(gdb) //敲回车键,继续执行list命令,显示当前行后面的源程序21 {22 printf("%s\n",p_str);23 }2425 void print_hello2(char *p_str)26 {27 printf("%s\n",p_str);28 }(gdb) list 8 //显示程序第8行的周围的源程序3 void print_hello1(char *p_str);4 void print_hello2(char *p_str);56 int main(int argc,char **argv)7 {8 double i,sum=0;9 char *pstr="hello in main";10 int arr[]={1,2,3,4,5};11 printf("%s\n",pstr);12 print_hello1("hello 1");(gdb) list 6,10 //显示程序第6-10行的源程序6 int main(int argc,char **argv)7 {8 double i,sum=0;9 char *pstr="hello in main";10 int arr[]={1,2,3,4,5};(gdb)gdb可以显示调试程序(编译程序时一定要加上-g参数,把源程序信息编译到执行文件中)的源代码。
gdb调试汇编语言

gdb调试汇编语言
GDB是一个功能强大的调试器,可以用来调试汇编语言程序。
在使用GDB调试汇编语言程序时,你需要首先确保程序已经被编译成可执行文件,并且包含了调试信息。
接下来,你可以通过以下步骤使用GDB来调试汇编语言程序:
1. 启动GDB,在命令行中输入`gdb`命令,然后在GDB提示符下输入可执行文件的名称。
2. 设置断点,你可以使用`break`命令在程序中设置断点,以便在特定的位置停止程序的执行。
例如,你可以输入`break main`来在程序的主函数处设置断点。
3. 运行程序,输入`run`命令来运行程序,程序会在设置的断点处停止执行。
4. 单步执行,使用`stepi`命令来逐条执行汇编指令,这样你可以逐步跟踪程序的执行过程。
5. 查看寄存器和内存,使用`info registers`命令可以查看寄
存器的值,而使用`x`命令可以查看内存中特定地址的内容。
6. 检查堆栈,使用`backtrace`命令可以查看当前的函数调用堆栈,而使用`frame`命令可以切换到不同的堆栈帧。
7. 观察变量,使用`print`命令可以查看特定变量的值,这对于检查程序状态非常有用。
8. 继续执行,当你想让程序继续执行时,可以使用`continue`命令来让程序一直执行到下一个断点或者程序结束。
以上是使用GDB调试汇编语言程序的基本步骤,当然,在实际调试过程中可能会有更复杂的情况需要处理,但是掌握了这些基本操作之后,你就可以更有效地使用GDB来调试汇编语言程序了。
希望这些信息对你有所帮助。
gdb调试技巧

gdb调试技巧GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。
它是一种强大的命令行调试工具。
一般来说,调试器的功能:能够运行程序,设置所有能影响程序运行的参数;能够让程序在指定条件下停止运行;能够在程序停止时检查所有参数的情况;能够根据指定条件改变程序的运行。
gdb调试源代码流程:1)进入GDB #gdb test只需输入GDB和要调试的可执行文件即可,在GDB的启动画面中指出了GDB的版本号、遵循的许可等信息,接下来就进入了由"(gdb)"开头的命令行界面了;2)查看文件(gdb) l在GDB中键入"l"(list)就可以查看程序的源码了,GDB列出的源代码中明确地给出了对应的行号,方便代码的定位;3)设置断点(gdb) b 6只需在"b"(break)后加入对应的行号即可,在GDB中利用行号设置断点是指代码运行到对应行之前暂停;设置断点可以使程序执行到某个位置时暂停,程序员在该位置处可以方便地查看变量的值、堆栈情况等;一般情况下,源代码中大家行号与用户书写程序的行号是一致的,但有时由于用户的某些编译选项会导致行号不一致的情况,因此,一定要查看在GDB中的行号;4)查看断点处情况(gdb) info b可以键入"info b"来查看断点处情况,可以设置多个断点;5)运行代码(gdb) rGDB默认从首行开始运行代码,键入"r"(run)即可;程序运行到断点处停止。
6)看变量值(gdb) p n在程序暂停之后,程序员可以查看断点处的相关变量值,在GDB 中只需键入"p 变量名"(print)即可;GDB在显示变量值时都会在对应值之前加上"$N"标记,它是当前变量值的引用标记,以后若想再次引用此变量,就可以直接写作"$N",而无需写冗长的变量名;7)观察变量(gdb) watch n在某一循环处,往往希望能够观察一个变量的变化情况,这时就可以键入命令"watch"来观察变量的变化情况,GDB在"n"设置了观察点;8)单步运行(gdb) n单步运行是指一次只运行一条语句,这样可以方便查看程序运行的结果,在此处只需键入"n"(next)即可;随着程序的单步运行,当变量n的值发生变化时,GDB就会自动显示出n的变化情况。
修改core file size-概述说明以及解释

修改core file size-概述说明以及解释1.引言1.1 概述在撰写此篇长文之前,我们首先需要了解什么是core file size以及为什么需要修改它。
Core file size指的是在发生程序崩溃或异常退出时,系统生成的core文件的大小限制。
正常情况下,core文件包含了程序崩溃时的内存状态、堆栈信息以及其他调试相关的数据,这对于开发人员来说是非常有价值的。
通过分析core文件,开发人员可以更容易地定位和解决问题。
默认情况下,操作系统对core文件的大小有一定的限制。
一旦core 文件大小达到了限制,系统会停止继续生成core文件,从而保护系统的稳定性和性能。
然而,在某些情况下,我们可能需要修改core file size 的限制,以便能够生成更大的core文件,以提供更详细的调试信息。
本文将讨论如何修改core file size的方法,以及对此操作可能带来的意义和影响。
在修改core file size之前,我们需要了解系统的具体配置和限制,并采取相应的步骤来修改系统设置。
同时,我们还将讨论可能的风险和注意事项,以确保在修改core file size时不会对系统的稳定性和安全性产生负面影响。
通过对core file size的修改,开发人员可以更充分地利用core文件提供的调试信息来定位和解决程序的问题。
然而,这也需要在操作系统的限制下谨慎操作,以确保系统的稳定性和性能不受影响。
在深入探讨修改core file size的方法之前,我们需要先了解当前系统的配置和限制,以便做出明智的决策并采取必要的措施。
接下来,本文将详细介绍好几种修改core file size的方法,并逐一讨论它们的优缺点和适用场景。
这将帮助读者根据实际需求选择最合适的方法来修改core file size。
在总结部分,我们将对本文的主要内容进行回顾,并强调修改core file size的重要性和潜在影响。
经典的GDB调试命令,包括查看变量,查看内存

经典的GDB调试命令,包括查看变量,查看内存经典的GDB调试命令,包括查看变量,查看内存在你调试程序时,当程序被停住时,你可以使⽤print命令(简写命令为p),或是同义命令inspect来查看当前程序的运⾏数据。
print命令的格式是:printprint /是表达式,是你所调试的程序的语⾔的表达式(GDB可以调试多种编程语⾔),是输出的格式,⽐如,如果要把表达式按16进制的格式输出,那么就是/x。
⼀、表达式print和许多GDB的命令⼀样,可以接受⼀个表达式,GDB会根据当前的程序运⾏的数据来计算这个表达式,既然是表达式,那么就可以是当前程序运⾏中的const常量、变量、函数等内容。
可惜的是GDB不能使⽤你在程序中所定义的宏。
表达式的语法应该是当前所调试的语⾔的语法,由于C/C++是⼀种⼤众型的语⾔,所以,本⽂中的例⼦都是关于C/C++的。
(⽽关于⽤GDB 调试其它语⾔的章节,我将在后⾯介绍)在表达式中,有⼏种GDB所⽀持的操作符,它们可以⽤在任何⼀种语⾔中。
@是⼀个和数组有关的操作符,在后⾯会有更详细的说明。
::指定⼀个在⽂件或是⼀个函数中的变量。
{}表⽰⼀个指向内存地址的类型为type的⼀个对象。
⼆、程序变量在GDB中,你可以随时查看以下三种变量的值:1. 全局变量(所有⽂件可见的)2. 静态全局变量(当前⽂件可见的)3. 局部变量(当前Scope可见的)如果你的局部变量和全局变量发⽣冲突(也就是重名),⼀般情况下是局部变量会隐藏全局变量,也就是说,如果⼀个全局变量和⼀个函数中的局部变量同名时,如果当前停⽌点在函数中,⽤print显⽰出的变量的值会是函数中的局部变量的值。
如果此时你想查看全局变量的值时,你可以使⽤::操作符:file::variablefunction::variable可以通过这种形式指定你所想查看的变量,是哪个⽂件中的或是哪个函数中的。
例如,查看⽂件f2.c中的全局变量x的值:gdb) p 'f2.c'::x当然,::操作符会和C++中的发⽣冲突,GDB能⾃动识别::是否C++的操作符,所以你不必担⼼在调试C++程序时会出现异常。
gdb使用教程

gdb使用教程GDB是GNU调试器的缩写,是一个功能强大的命令行调试工具,用于帮助开发人员在调试过程中定位和修复程序中的错误。
以下是GDB的使用教程:1. 编译程序时添加调试信息:在使用GDB进行调试之前,需要确保程序在编译时包含了调试信息。
可以通过在编译命令中添加`-g`选项来实现。
例如:`gcc -g main.c -o main`。
2. 启动GDB:在命令行中输入`gdb`命令,然后输入可执行文件的路径作为参数。
例如:`gdb ./main`。
3. 设置断点:断点是在程序执行到指定位置时停下来的标记。
可以使用`break`命令来设置断点。
例如:`break main`可以在`main`函数的开头设置一个断点。
4. 开始执行程序:使用`run`命令来运行程序。
例如:`run`。
5. 执行程序并停在断点处:当程序开始运行后,会在达到断点处停下来等待输入。
此时可以使用一些GDB命令来检查程序的状态,如查看变量的值、栈帧等。
6. 单步执行:使用`next`命令来逐行执行程序。
例如:`next`。
7. 跳出函数:使用`finish`命令可以跳出当前正在执行的函数,并停在调用该函数的上一个函数中。
8. 继续执行:使用`continue`命令可以接着执行程序直到下一个断点或程序结束。
9. 查看变量的值:使用`print`或简写的`p`命令可以查看变量的值。
例如:`print i`可以查看变量`i`的值。
10. 修改变量的值:使用`set`命令可以修改变量的值。
例如:`set i = 10`可以将变量`i`的值修改为10。
11. 查看函数调用栈:使用`backtrace`或简写的`bt`命令可以查看函数调用栈。
12. 退出GDB:使用`quit`命令可以退出GDB。
以上是一些常用的GDB命令,使用GDB进行调试时还有很多其他的功能和命令可以使用,可以通过阅读GDB的文档来更详细地了解。
gdb debug插件用法

gdb debug插件用法
在GNU调试器(GDB)中,调试插件是用于增强调试功能的扩展。
GDB可以通过使用插件来提供更多的功能,例如支持特定的编程语言、硬件架构或者提供额外的调试工具。
GDB调试器支持多种插件,这些插件具有不同的功能和用途。
以下是一些常见的GDB调试插件以及它们的用途:
Python插件:允许在GDB中使用Python脚本进行调试。
可以通过Python 脚本编写自定义的调试命令和脚本,以实现更复杂的调试操作。
Reverse Debugging插件:提供反向调试功能,允许按照程序的反向执行来进行调试,有助于查找问题。
Pretty Printing插件:用于美化打印输出,特别是对于复杂的数据结构,比如C++中的STL容器。
它可以改善输出的可读性。
硬件特定插件:针对特定的硬件架构或设备,提供额外的调试支持。
通常情况下,要使用GDB的插件功能,你需要先了解你想要使用的插件是否可用,并在GDB中加载它们。
具体的加载方式取决于所使用的插件类型和GDB 的版本。
例如,加载Python插件可以通过以下步骤完成:确保GDB编译时启用了Python支持。
在GDB中使用python命令加载Python插件,例如:(gdb)python import gdb 这样就可以使用Python脚本进行自定义的调试操作了。
对于特定的调试插件,最好查阅GDB的官方文档以获取详细的加载和使用方法,不同的插件可能有不同的配置和加载方式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.6 调试2.6.1 调试器FreeBSD 自带的调试器叫 gdb (GNU debugger)。
要运行,输入%gdb progname然而大多数人喜欢在Emacs中运行这个命令。
可以这样来起动这个命令:M-x gdb RET progname RET调试器能让你在一个可控制的环境中运行一个程序。
例如,你可以一次运行程序的一行代码,检查变量的值,改变这些值,或者让程序运行到某个定点然后停止等等。
你甚至可以调试内核,当然这样会比我们将要讨论的问题要多一点点技巧。
gdb 有非常棒的在线帮助,还有同样棒的 info 页面。
因此这一章我们会把注意力集中到一些基本的命令上。
最后,如果你不习惯这个命令的命令行界面,在 Ports 中还有一个它的图形前端 (devel/xxgdb)。
这一章准备只介绍 gdb 的使用方法,而不会牵涉到特殊的问题比如调试内核。
2.6.2 在调试器中运行一个程序要最大限度的利用 gdb,需要使用 -g 这个选项来编译你的程序。
如果你没有这样做,那么你只会看到你正在调试的函数名字,而不是它的源代码。
如果gdb起动时提示:... (no debugging symbols found) ...你就知道你的程序在编译的时候没有使用 -g 选项。
当 gdb 给出提示符,输入 break main。
这就是告诉调试器你对正在运行的程序中预先设置的代码没有兴趣,并且调试器应该停在你的代码的开头。
然后输入 run来开始你的程序──这会从预先设置的代码开始然后在调试器调用 main() 的时候就停下来。
(如果你曾迷惑 main() 是在哪里被调用的,现在应该明白了吧!)现在你可以一步一步来检查你的程序,按下 n一次就查一行。
一旦你碰见了一个函数调用,可以输入 f 从函数调用中退出来。
你可以输入 up 或 down 来快速检查这个调用。
这里列出了一个简单的例子。
展示了怎样用 gdb 定位一个错误。
这是我们的程序(其中有一个明显的错误):这个程序给 i 赋值 5并把它传递给一个函数 bazz(),这个函数将打印出我们给出的数值。
我们现在编译并运行这个程序,我们会得到%cc -g -o temp temp.c%./tempThis is my programanint = 4231但这并不是我们想要的!应该看看到底发生了什么!%gdb tempGDB is free software and you are welcome to distribute copies of itunder certain conditions; type "show copying" to see the conditions.There is absolutely no warranty for GDB; type "show warranty" for details.GDB 4.13 (i386-unknown-freebsd), Copyright 1994 Free Software Foundation, Inc.(gdb) break main Skip the set-up codeBreakpoint 1 at 0x160f: file temp.c, line 9. gdb puts breakpoint at main()(gdb) run Run as far as main()Starting program: /home/james/tmp/temp Program starts runningBreakpoint 1, main () at temp.c:9 gdb stops at main() (gdb) n Go to next lineThis is my program Program prints out(gdb) s step into bazz()bazz (anint=4231) at temp.c:17 gdb displays stack frame(gdb)停住!怎么 anint 会是 4231?难道我们没有在函数 main()中设定为 5 吗?现在我们转到 main()来看看。
(gdb) up Move up call stack#1 0x1625 in main () at temp.c:11 gdb displays stack frame (gdb) p i Show us the value of i$1 = 4231 gdb displays 4231哦,天哪!看看这代码,我们忘了初始化 i 了。
本来我们是想的但是我们忘了 i=5; 这一行。
因为我们没有初始化 i,这个变量在程序运行的时候就储存了偶然在那块内存中存在的任意值。
注意:gdb 会显示我们进入或离开一个函数时的栈的值。
即使是我们在使用 up 或 down 的时候。
这会显示函数的名称还有参数的值,让我们知道自己的位置以及正在发生什么事情。
(栈能储存程序在调用函数的时使用的参数,以及调用时的位置,以便程序在从函数调用结束后知道自己的位置。
)2.6.3 检查 core 文件基本上 core 文件就是一个包含了程序崩溃时这个进程的所有信息的文件。
在那“遥远的黄金年代”,程序员不得不把 core 文件以十六进制的方式显示出来,然后满头大汗的阅读机器码的手册,但是现在事情就简单得多了。
顺便说一下,在 FreeBSD和其他的 4.4BSD 系统下,core 文件都叫作progname.core 而不是简单叫core,这样可以很清楚的表示出这个 core 文件是属于哪个程序。
要检查一个 core 文件,以通常的方式起动 gdb。
不要输入 break 或者run,而要输入(gdb) core progname.core如果你没有和 core 文件在同一个目录,首先要执行 dir/path/to/core/file。
你应该可以看见:%gdb a.outGDB is free software and you are welcome to distribute copies of itunder certain conditions; type "show copying" to see the conditions.There is absolutely no warranty for GDB; type "show warranty" for details.GDB 4.13 (i386-unknown-freebsd), Copyright 1994 Free Software Foundation, Inc.(gdb) core a.out.coreCore was generated by `a.out'.Program terminated with signal 11, Segmentation fault. Cannot access memory at address 0x7020796d.#0 0x164a in bazz (anint=0x5) at temp.c:17(gdb)这种情况下,运行的程序叫 a.out,因此 core 文件就叫 a.out.core。
我们知道程序崩溃的原因就是函数 bazz 试图访问一块不属于它的内存。
有时候,能知道一个函数是怎么被调用的是非常有用处的。
因为在一个复杂的程序里面问题可能会发生在函数调用栈上面很远的地方。
命令 bt 会让gdb 输出函数调用栈的回溯追踪。
(gdb) bt#0 0x164a in bazz (anint=0x5) at temp.c:17#1 0xefbfd888 in end ()#2 0x162c in main () at temp.c:11(gdb)函数 end() 在一个程序崩溃的时候将被调用;在本例中,函数 bazz() 是从 main()中被调用的。
2.6.4 粘付到一个正在运行的程序gdb 一个最精致的特性就是它能粘付到一个已经在运行的程序上。
当然,我们得首先假定你有足够的权限这样去做。
一个常见的问题就是,当我们在追踪一个包含子进程的程序时,如果你要追踪子进程,但是调试器只允许你追踪父进程。
你要做的就是起动另一个 gdb,然后用 ps 找出子进程的进程号。
然后在gdb中执行(gdb) attach pid就可以像平时一样调试了。
“这很好,”你可能在想,“当我这样做了以后,子进程就会不见了”。
别怕,亲爱的读者,我们可以这样来做(参照 gdb 的 info页)...if ((pid = fork()) < 0) /* _Always_ check this */error();else if (pid == 0) { /* child */int PauseMode = 1;while (PauseMode)sleep(10); /* Wait until someone attaches to us */ ...} else { /* parent */...现在所有你要做的就是粘付到子进程,设置 PauseMode 为0,然后等待函数 sleep 返回!。