小编auf*_*her的帖子

我们可以在GDB会话中定义新的数据类型吗?

有没有办法在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

gdb

31
推荐指数
1
解决办法
5999
查看次数

为什么堆栈大小有限制?

可能重复:
堆栈和堆的内容和位置

我安装的Ubuntu的默认堆栈大小限制为8 MB.但我很好奇为什么我们需要限制用户程序的堆栈大小.同一个程序可以通过malloc/mmap等使用它的所有4 GB(32位程序)可寻址空间.那么为什么我们需要一个堆栈大小限制呢?为什么堆栈不能增长直到它几乎遇到堆?

stack callstack

7
推荐指数
1
解决办法
6518
查看次数

为什么Linux TAP设备不处理ARP或ICMPv6数据包

我正在使用打开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)

c linux arp icmp

5
推荐指数
1
解决办法
2356
查看次数

标签 统计

arp ×1

c ×1

callstack ×1

gdb ×1

icmp ×1

linux ×1

stack ×1