有没有办法在gdb中定义新的数据类型(C结构或联合).我们的想法是定义一个结构,然后从解释为新定义结构的地址中创建gdb打印数据.
例如,假设我们有一个示例结构.
struct sample {
int i;
struct sample *less;
struct sample *more;
}
Run Code Online (Sandbox Code Playgroud)
如果0x804b320是数组的地址struct sample
.二进制文件没有调试信息,因此gdb可以理解struct sample
.有没有办法struct sample
在gdb会话中定义?这样我们就可以打印了p *(struct sample *)0x804b320
可能重复:
堆栈和堆的内容和位置
我安装的Ubuntu的默认堆栈大小限制为8 MB.但我很好奇为什么我们需要限制用户程序的堆栈大小.同一个程序可以通过malloc/mmap等使用它的所有4 GB(32位程序)可寻址空间.那么为什么我们需要一个堆栈大小限制呢?为什么堆栈不能增长直到它几乎遇到堆?
我正在使用打开TAP设备
p->fd = open("/dev/net/tun", O_RDWR);
// skipping error handling code
ifr.ifr_flags = IFF_TAP | IFF_ONE_QUEUE | IFF_NO_PI;
strncpy(ifr.ifr_name, p->name, IFNAMSIZ-1);
result = ioctl(p->fd, TUNSETIFF, &ifr);
// skipping error handling and setting ipv4 address & netmask code
ifr.ifr_flags = (IFF_UP | IFF_RUNNING);
result = ioctl(dummySock, SIOCSIFFLAGS, &ifr);
Run Code Online (Sandbox Code Playgroud)
我面临的问题是当一个应用程序(比如mozilla)希望通过tap设备发送数据包时,它需要获取dst mac地址.所以内核发出ARP请求.我正在编写的应用程序转发arp请求(通过物理eth设备上的原始套接字)并获得arp回复.这个arp回复被转发回tap设备,但是内核拒绝接受这个.如果我手动添加arp条目,则不会生成arp请求,并且有两种方式ip packet exchange(mozilla很高兴).
Wireshark能够接收数据包并发现没有错误.ICMPv6数据包(邻居请求和广告)的情况也是如此.在设备上侦听的任何应用程序都会保持数据包不变 但内核不会为ARP/ICMP处理它.
我的问题是,为什么内核不接受arp reply/ICMPv6 msgs?我们需要拨打一些ioctl电话吗?
编辑:
以下是点击设备"ethgress"中捕获的数据包(tshark输出)的详细信息
9 16.548328 fc00:1::2 -> ff02::1:ff00:1 ICMPv6 86 Neighbor Solicitation
10 17.243247 fc00:1::100 -> fc00:1::2 ICMPv6 86 Neighbor Advertisement
11 17.548652 fc00:1::2 -> ff02::1:ff00:1 …
Run Code Online (Sandbox Code Playgroud)