当前位置: 首页 > 知识库问答 >
问题:

无效的内存地址或零指针取消引用

方野
2023-03-14

我是gccgo新手,我需要编译/运行以下代码的帮助(这在“标准”go编译器中可以正常工作(抱歉,我不知道正确的名称)):

我的gcc:

nailor@macbuntu:*rgo/src/tictoc-demo$ gccgo -v
Using built-in specs.
COLLECT_GCC=gccgo
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.7/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.7.2-0ubuntu3' --with-bugurl=file:///usr/share/doc/gccgo-4.7/README.Bugs --enable-languages=c,c++,go --prefix=/usr --program-suffix=-4.7 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.7 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-0ubuntu3) 

我的第一个文件

nailor@macbuntu:*rgo/src/tictoc-demo$ cat tictoc.go        
package tictoc

import "fmt"
import "time"

var ticTime = time.Now()
const default_section_name = "measurement"
var section_name = default_section_name

func Tic() {
    TicM(default_section_name)
}

func TicM(name string) {
    section_name = name
    fmt.Printf("[%s] tic\n", section_name)
    ticTime = time.Now()
}

func Toc() {
    TocM("")
}

func TocM(message string) {
    dur := time.Now().Sub(ticTime).Seconds()
    fmt.Printf("[%s] [%s] toc %5f\n", section_name, message, dur)
}

func TocTic() {
   Toc();
   Tic();
}

func TocTicM(message string) {
   Toc();
   TicM(message);
}

我的第二个文件:

nailor@macbuntu:*rgo/src/tictoc-demo$ cat tictoc-demo.go                         
package main

import . "tictoc"

func main(){
    Tic()
    Toc()
    Toc()
    TicM("2nd tic")
    Toc()
    Toc()
    TocM("Error")
    Toc()
    TocM("More Fancy")
    Toc()
    Toc()
    TocTic()
    Toc()
}

我的编译错误:

nailor@macbuntu:*rgo/src/tictoc-demo$ gccgo -c tictoc.go                   
nailor@macbuntu:*rgo/src/tictoc-demo$ gccgo -c tictoc-demo.go              
nailor@macbuntu:*rgo/src/tictoc-demo$ gccgo -o tictoc-demo tictoc-demo.o tictoc.o -static
nailor@macbuntu:*rgo/src/tictoc-demo$ ./tictoc-demo 
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x0]

goroutine 2 [syscall]:

goroutine 1 [runnable]:
nailor@macbuntu:*rgo/src/tictoc-demo2$

我做错了什么?

共有2个答案

宇文迪
2023-03-14

此错误已在4.8版本中修复。

要在使用4.7时链接到static,可以在链接时添加Wl、-u、pthread\u create。

洪育
2023-03-14

您没有做错任何事。这看起来像是进行全静态链接时编译器中的错误。请尝试使用-stage-libgo进行链接,它应该可以工作。

这是gdb中的回溯跟踪:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()
(gdb) bt
#0  0x0000000000000000 in ?? ()
#1  0x00000000004adf67 in __wrap_pthread_create ()
#2  0x000000000040657e in runtime_newm ()
#3  0x000000000040665b in matchmg ()
#4  0x0000000000406f15 in syscall.Entersyscall ()
#5  0x0000000000403e5c in runtime_MHeap_Scavenger ()
#6  0x0000000000406e15 in kickoff ()
#7  0x00000000004ba910 in ?? ()
#8  0x0000000000000000 in ?? ()

我会看看是否已经有一个bug提交到上游,或者提交一个其他的bug。

(提交的问题:http://golang.org/issue/6375)

 类似资料:
  • 我收到一个无效内存地址的运行时错误。 channel.go看起来像这样: 第36行怎么可能导致这种情况?m是否有可能为零?如果是,如何? 注意:哈希定义为字符串

  • 我正在尝试使用带有自定义分隔符的Go html/模板。 但是,我可以解析并执行我的“index.html”文件,每当我试图更改模板分隔符时,我都会遇到以下错误: 这是我的代码: 如果我尝试以下任何一种: 或: 一切正常。我甚至试图捕捉ParseFiles错误。但仍然没有运气: 我看不出我做错了什么。如果你们中的任何人能在这个问题上帮助我,我将不胜感激。 更新1: 这就是恐慌:

  • 调用原子。结构字段上的AddInt64会恐慌,但当我们重新排列字段顺序时不会;为什么? 使用此类型: 并调用

  • 我是新手,试图制作一个简单的网络爬虫。我一直收到“恐慌:运行时错误:无效的内存地址或零指针取消引用”,不知道如何解决这个问题。我有一个“AdvancedFetcher”函数和一个“basicFetcher”函数,我在其中任何一个下都收到相同的错误。这个答案建议检查每个错误(我想我有),但我仍然收到错误。谢谢! 编辑#1:

  • 我是golang的新手,目前正在学习本教程和源代码-http://golang.org/doc/articles/wiki/part2.go 创建此文件后,我将 知道我做错了什么导致了这种明显的记忆损坏吗?

  • 运行Go程序时,它会惊慌失措并返回以下信息: 我查看了其他人对相同异常的响应,但没有看到任何简单的响应(即未处理的错误)。 我在一台无法访问代码中列出的API服务器的机器上运行它,但我希望它会返回一个适当的错误(因为我试图捕捉这种错误)。