草庐IT

DEBUGGING

全部标签

linux - 如何调试用 'make' 编译的程序?

gdb教程建议使用“gcc-g”进行编译以使用调试符号编译程序。但是,我想调试一个用make编译的程序。如何指示make使用调试符号进行编译?谢谢。 最佳答案 为了更改编译选项,您需要编辑运行“make”的目录中的文件“Makefile”。在该文件中查找以下内容之一:定义编译器的变量,可能是这样的:CC='gcc'调用编译器的实际行(更可能是在手工制作的Makefile中)。称为CFLAGS或CXXFLAGS的变量在前两种情况下,只需在'gcc'之后添加'-ggdb',在第三种情况下,只需添加'-ggdb'就更容易了,例如:CFLA

linux - 使用 kprobes 获取函数参数

我已经在一个函数上放置了一个kprobe,现在我需要在kprobe的预处理器函数中获取它的参数值。这是我的功能:voidfoobar(intarg,intarg2,intarg3,intarg4,intarg5,intarg6,intarg7,intarg8){printk("foobarcalled\n");}将kprobe放在上面并调用函数:...kp.addr=(kprobe_opcode_t*)foobar;register_kprobe(&kp);foobar(0xdead1,0xdead2,0xdead3,0xdead4,0xdead5,0xdead6,0xdead7,0x

linux - 使用 kprobes 获取函数参数

我已经在一个函数上放置了一个kprobe,现在我需要在kprobe的预处理器函数中获取它的参数值。这是我的功能:voidfoobar(intarg,intarg2,intarg3,intarg4,intarg5,intarg6,intarg7,intarg8){printk("foobarcalled\n");}将kprobe放在上面并调用函数:...kp.addr=(kprobe_opcode_t*)foobar;register_kprobe(&kp);foobar(0xdead1,0xdead2,0xdead3,0xdead4,0xdead5,0xdead6,0xdead7,0x

c++ - 每个进程可配置的核心转储目录

有没有办法为特定进程配置放置核心转储文件的目录?我有一个用C++编写的守护进程,我想为其配置核心转储目录。可选地,文件名模式也应该是可配置的。我知道/proc/sys/kernel/core_pattern,但是这会全局改变模式和目录结构。Apache有指令CoreDumpDirectory-所以这似乎是可能的。 最佳答案 不,您不能为每个进程设置它。核心文件被转储到进程的当前工作目录,或者如果模式包含目录,则转储到/proc/sys/kernel/core_pattern中设置的目录。apache中的CoreDumpDirecto

c++ - 每个进程可配置的核心转储目录

有没有办法为特定进程配置放置核心转储文件的目录?我有一个用C++编写的守护进程,我想为其配置核心转储目录。可选地,文件名模式也应该是可配置的。我知道/proc/sys/kernel/core_pattern,但是这会全局改变模式和目录结构。Apache有指令CoreDumpDirectory-所以这似乎是可能的。 最佳答案 不,您不能为每个进程设置它。核心文件被转储到进程的当前工作目录,或者如果模式包含目录,则转储到/proc/sys/kernel/core_pattern中设置的目录。apache中的CoreDumpDirecto

c - 反调试 : gdb does not write 0xcc byte for breakpoints. 知道为什么吗?

我正在学习Linux上的一些反调试技术,发现了一段代码,用于检查内存中的0xcc字节以检测gdb中的断点。这是代码:if((*(volatileunsigned*)((unsigned)foo+3)&0xff)==0xcc){printf("BREAKPOINT\n");exit(1);}foo();但它不起作用。我什至尝试在foo()函数上设置断点并观察内存中的内容,但没有看到任何为断点写入的0xcc字节。这是我所做的:(gdb)bfooBreakpoint1at0x804846a:filep4.c,line8.(gdb)x/x0x804846a0x804846a:0xe02404c

c - 反调试 : gdb does not write 0xcc byte for breakpoints. 知道为什么吗?

我正在学习Linux上的一些反调试技术,发现了一段代码,用于检查内存中的0xcc字节以检测gdb中的断点。这是代码:if((*(volatileunsigned*)((unsigned)foo+3)&0xff)==0xcc){printf("BREAKPOINT\n");exit(1);}foo();但它不起作用。我什至尝试在foo()函数上设置断点并观察内存中的内容,但没有看到任何为断点写入的0xcc字节。这是我所做的:(gdb)bfooBreakpoint1at0x804846a:filep4.c,line8.(gdb)x/x0x804846a0x804846a:0xe02404c

c++ - 调试客户机器上生成的核心文件

我们通过在客户的机器上运行我们的软件获得核心文件。不幸的是,因为我们总是使用-O2不带调试符号进行编译,这导致了我们无法弄清楚崩溃原因的情况,我们修改了构建,所以现在它们生成-g和-O2在一起。然后,我们建议客户运行-g二进制文件,以便更容易调试。我有几个问题:如果核心文件是从我们在Dev中运行的Linux发行版以外的发行版生成的,会发生什么情况?堆栈跟踪是否有意义?有没有关于在Linux或Solaris上进行调试的好书?面向示例的东西会很棒。我正在寻找真实的例子来弄清楚例程崩溃的原因以及作者如何找到解决方案。更多中级到高级的东西会很好,因为我已经这样做了一段时间了。一些组装也会很好。

c++ - 调试客户机器上生成的核心文件

我们通过在客户的机器上运行我们的软件获得核心文件。不幸的是,因为我们总是使用-O2不带调试符号进行编译,这导致了我们无法弄清楚崩溃原因的情况,我们修改了构建,所以现在它们生成-g和-O2在一起。然后,我们建议客户运行-g二进制文件,以便更容易调试。我有几个问题:如果核心文件是从我们在Dev中运行的Linux发行版以外的发行版生成的,会发生什么情况?堆栈跟踪是否有意义?有没有关于在Linux或Solaris上进行调试的好书?面向示例的东西会很棒。我正在寻找真实的例子来弄清楚例程崩溃的原因以及作者如何找到解决方案。更多中级到高级的东西会很好,因为我已经这样做了一段时间了。一些组装也会很好。

c - 为什么 gdb 在从函数返回时停在与 "i b"显示不同的行?

这是我要调试的程序:#includeinti=5;intmain(void){intx=3;display(x);return0;}voiddisplay(intx){for(i=0;i这段代码来自这里http://www.dirac.org/linux/gdb/05-Stepping_And_Resuming.php#breakpointsandwatchpoints.这是问题所在:(gdb)breakdisplayBreakpoint1at0x40051e:filetry5.c,line15.(gdb)runStartingprogram:/home/ja/gdb/learning