当前位置: 首页 > 面试题库 >

golang gdb-打印变量

戚学
2023-03-14
问题内容

我对gdb无法正确打印变量有疑问。通过以下方式构建简单程序:

chmurson-osx:helloworld chmurson$ go build -gcflags '-N' start.go

然后执行gdb:

chmurson-osx:helloworld chmurson$ gdb start -d $GOROOT
GNU gdb (GDB) 7.8
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/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 "x86_64-apple-darwin14.0.0".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from start...done.
warning: Missing auto-load scripts referenced in section .debug_gdb_scripts
of file /Users/chmurson/Dev/goprojects/misc/src/helloworld/start
Use `info auto-load python-scripts [REGEXP]' to list them.
(gdb) 
(gdb) source /usr/local/go/src/pkg/runtime/runtime-gdb.py
Loading Go Runtime support.

这是我下一步要做的:

(gdb) list
1   package main
2   
3   import "fmt"
4   
5   func main() {
6       x := "abc"
7       i := 3
8       fmt.Println(i)
9       fmt.Println(x)
10  }
(gdb) b 9
Breakpoint 1 at 0x2106: file /Users/chmurson/Dev/goprojects/misc/src/helloworld/start.go, line 9.
(gdb) run
Starting program: /Users/chmurson/Dev/goprojects/misc/src/helloworld/start 
3
[New Thread 0x1113 of process 14039]

Breakpoint 1, main.main () at /Users/chmurson/Dev/goprojects/misc/src/helloworld/start.go:9
9       fmt.Println(x)
(gdb) p x
Python Exception <type 'exceptions.OverflowError'> signed integer is greater than maximum: 
$1 = 
(gdb) p i
$2 = 8725692800
(gdb)

您可以看到在检查’p’变量时存在Python异常,而在显示’i’值时完全没有3。怎么了 ?

这是我去的版本

chmurson-osx:helloworld chmurson$ go version
go version go1.3.1 darwin/amd64

和gdb配置

(gdb) show configuration
This GDB was configured as follows:
   configure --host=x86_64-apple-darwin14.0.0 --target=x86_64-apple-darwin14.0.0
             --with-auto-load-dir=:${prefix}/share/auto-load
             --with-auto-load-safe-path=:${prefix}/share/auto-load
             --with-expat
             --with-gdb-datadir=/usr/local/share/gdb (relocatable)
             --with-jit-reader-dir=/usr/local/lib/gdb (relocatable)
             --without-libunwind-ia64
             --without-lzma
             --with-python=/System/Library/Frameworks/Python.framework/Versions/2.7
             --without-guile
             --with-separate-debug-dir=/usr/local/lib/debug (relocatable)
             --with-zlib
             --without-babeltrace

("Relocatable" means the directory can be moved with the GDB installation
tree, and GDB will still find it.)

问题答案:

添加到@AlexAtNet的答案中,Go 1.2.x之后的所有内容都中断了GDB支持,因此请使用go 1.2.x进行调试或使用gccgo(请记住,gcc
4.8.x支持go 1.1,gcc 4.9.x最高为1.2)。 。

另一个选择是使用您自己的跟踪函数,虽然不是很漂亮,但它是go 1.3+的唯一真正的调试选项。

我个人使用这样的东西进行调试:

var traceLock sync.Mutex

func trace(a ...interface{}) {
    traceLock.Lock()
    pc, f, ln, ok := runtime.Caller(1)
    fn := ""
    if ok {
        fn = runtime.FuncForPC(pc).Name()
    }
    fmt.Printf("trace: %s %s:%d", fn, filepath.Base(f), ln)
    if len(a) > 0 {
        fmt.Println(append([]interface{}{": "}, a...)...)
    }
    traceLock.Unlock()
}

playground



 类似资料:
  • Xdebug替换了PHP的var_dump()函数来显示变量。Xdebug的版本包含不同类型的不同颜色,并限制数组元素/对象属性的数量,最大深度和字符串长度。还有一些其他功能处理变量显示。 设置对var_dump的影响 有许多设置可以控制Xdebug修改的var_dump()函数的输出 :xdebug.var_display_max_children,xdebug.var_display_max_

  • 问题内容: 所以语法似乎与我在Python 2中学到的有所不同…这就是到目前为止 第一个值为int,第二个为字符串,最后一个为int。 如何更改我的打印语句,以便正确打印变量? 问题答案: 语法已更改,因为它现在是一个函数。这意味着格式需要在括号内完成:1 但是,由于您使用的是Python 3.x,因此实际上应该使用较新的方法: 尽管尚未 正式 弃用格式(但是),但仍不建议使用该格式,因此很可能会

  • /* main.c */ extern void print_var_1(void); extern void print_var_2(void); int main(void) { print_var_1(); print_var_2(); return 0; } /* static-1.c */ #include <stdio.h> static int var = 1;

  • 问题内容: 在此程序中,如何中断调试器的执行并打印i的值? 我不能打印。但是我可以打印x: 问题答案: 听起来好像变量可能已被编译器优化为不存在。您是否尝试过调试构建? 您可以使用。

  • 问题内容: Go中有类似Ruby的东西吗? 例如,在Ruby中,您可以编写: 输出将是: 我能找到的最接近的东西是 问题答案: 如果您的目标是避免导入第三方软件包,则另一个选择是使用json.MarshalIndent: 输出: 工作示例:http : //play.golang.org/p/SNdn7DsBjy

  • 问题内容: 我有一个PostgreSQL函数 如何将DeletedContactId的值打印到控制台? 问题答案: 您可以按以下方式提出通知: 在这里阅读