根据Carp模块文档,除非$Carp::Verbose计算为true,否则croak()不应生成任何堆栈跟踪。但出于某种原因,在我的环境中,croak()的行为总是像confess()一样,即总是打印堆栈跟踪,即使它不应该打印。
下面是一个测试脚本:
#!/usr/bin/perl
use Modern::Perl;
use Carp;
sub func
{
say "Carp::Verbose = $Carp::Verbose";
croak "There should be no stack trace after this message!
我试图访问上一个堆栈中的一个变量,它在Linux中给了我以下错误:
.... terminated by signal SIGSEGV (Address boundary error
然而,在2014年的CS61C讲座中,产出如下:
3
Something Random
在那台机器和我的Linux之间,它是怎么工作的?
为什么它要打印3 first time而不打印second time呢?如果printf不使用这个插槽来做其他事情,那么的行为也应该第二次发生--不是吗?
以下是代码:
#include<stdio.h>
int *ptr() {
在RedHat Linux上构建了一个共享对象,虽然所有代码都是使用debug编译的,但调试器(gdb)拒绝加载符号并发出错误,如下所示:
...
GNU gdb Fedora (6.8-37.el5)
...
This GDB was configured as "x86_64-redhat-linux-gnu"...
Dwarf Error: wrong version in compilation unit header (is 4, should be 2) [in module libgrokf.so]
有了这个错误,我无法在任何函数中触发断点,也看不到正确的堆