【问题标题】:Segmentation Fault - 32 / 64 Bit issue?分段错误 - 32 / 64 位问题?
【发布时间】:2013-02-25 14:54:54
【问题描述】:

我目前正在做一个小项目,当超出特定限制以处理以下步骤(例如警报、空路由等)时,它会捕获数据包并触发外部应用程序或脚本。

我尝试使用此代码创建一个非常简单的触发器(“触发器”包含二进制文件或脚本的路径):

char * trigger_complete;
sprintf(trigger_complete, "%s %u %u %s %s %Lf", trigger, data[II].count, data[II].proto, inet_ntoa(data[II].src_ip), inet_ntoa(data[II].dst_ip), rate);
system (trigger_complete);

在我的 Ubuntu 12.04.1 LTS 上,它似乎可以正常工作,我使用“echo”应用程序进行了测试。

linux-gate.so.1 =>  (0xb779f000)
libpcap.so.0.8 => /usr/lib/i386-linux-gnu/libpcap.so.0.8 (0xb7752000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75a8000)
/lib/ld-linux.so.2 (0xb77a0000)

在 Debian Wheezy 和“grml”实例上,我在执行二进制文件时收到分段错误。 (我通过注释掉并重试验证了这个问题是由上面的代码段引起的。)

linux-vdso.so.1 =>  (0x00007fff875ff000)
libpcap.so.0.8 => /usr/lib/x86_64-linux-gnu/libpcap.so.0.8 (0x00007fa9c6048000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa9c5cbe000)
/lib64/ld-linux-x86-64.so.2 (0x00007fa9c608d000)

我看到的唯一区别是架构,Ubuntu 系统是 32 位操作系统,而 Debian 是 64 位操作系统。

我不确定这是否是问题所在,但似乎确实如此。

谁能帮我解决这个问题?

提前谢谢你!

【问题讨论】:

  • ...可能想为trigger_complete分配一些内存!
  • 顺便说一句:inet_ntoa() 返回一个指向静态分配缓冲区的指针。在 printf() 的参数中调用它两次可能会导致结果看起来相等,因为第二次调用会覆盖第一次调用的结果。顺便说一句:真正的错误可能在您没有显示的行中。
  • 似乎使用 malloc() 对我有用。我将不得不进一步检查。到目前为止,谢谢。
  • 您关于 inet_ntoa() 的提示是正确的,我必须解决这个问题,但这是另一章;)谢谢!
  • 是的,本来可以的。顺便说一句,检查段错误的一个好工具是“valgrind”。

标签: c triggers capture


【解决方案1】:

由于对mark a comment as an answer 的功能请求仍然被拒绝,我在此处复制上述解决方案。

... 可能想为 trigger_complete 分配一些内存! ——托马斯

【讨论】:

    猜你喜欢
    • 2017-02-03
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 2016-07-13
    • 1970-01-01
    • 2019-06-13
    相关资源
    最近更新 更多