我对工会会员的地址有基本的了解。最近,我发现了如下数据结构:
typedef union {
char data[16];
struct {
uint8_t filler[15],
/* how many free bytes in this stack allocated string
* same idea as fbstring
*/
space_left : 4,
/* if it is on heap, set to 1 */
在这个程序中,如何使用调试器中断执行并打印i的值?
package main
import "fmt"
func main() {
x := "abc"
i := 3
fmt.Println(i)
fmt.Println(x)
}
我不能打印i。但是我可以打印x:
go build test.go
gdb test
[...]Reading symbols from /home/ned/test...done.
(gdb) br 9
(gdb) run
(gdb) p i
No symbol
我正在尝试找出是否有一种方法可以在核心转储的情况下隐藏/避免打印变量值。我发现当存在核心转储时,当遍历gdb时,我们能够找到预期变量的值,但需要一种不会发生这种情况的方法。在我寻找的过程中,我偶然发现了这个特殊的链接。但是我仍然可以看到打印出来的值。
(gdb) p data $1 = (void *) 0x615000 (gdb)
我正在尝试显示当前堆栈帧中的内存打印,但现在我要做的是费力的:
# Find out how big the current frame is:
(gdb) print/x $ebp - $esp
$1 = 0x4
# Use that in a display:
(gdb) x/4x $ebp
我很想使用define命令来实现它,所以在每一步之后都会发生这种情况,所以我对堆栈框架有一个持续的了解。
做这样的事情:
(gdb) x/$1x $ebp
(gdb) x/($1)x $ebp
一直没起作用。
当打印出多个字块(4个字节)时,gdb是否颠倒了字节的顺序?如果是,那为什么?这与程序如何读取内存有关吗?
这里有一个示例代码来演示我所说的倒序是什么意思
// test.c
#include <stdio.h>
int main(int argc, char *argv[])
{
int large = 33825; // 1000 0100 0010 0001
int zero = 0; // 0000 0000 0000 0000
int ten = 10; //