线程1中的堆栈溢出:无法将堆栈增加到0xffe601ff8 Valgrind Error

时间:2014-11-09 03:00:45

标签: c++ c segmentation-fault stack-overflow

我是C编程新手,感谢任何帮助。该代码将用于检查pid是否仍处于活动状态。提供pid文件路径的参数通过命令行传递。请参阅下面的Valgrind和GDB错误以及代码。

**Valgrind Error**
==6553== Memcheck, a memory error detector
==6553== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==6553== Using Valgrind-3.10.0 and LibVEX; rerun with -h for copyright info
==6553== Command: ./pid1108_2 /var/run/httpd/httpd.pid
==6553== 
==6553== Stack overflow in thread 1: can't grow stack to 0xffe601ff8
==6553== 
==6553== Process terminating with default action of signal 11 (SIGSEGV)
==6553==  Access not within mapped region at address 0xFFE601FF8
==6553==    at 0x40069F: kill (in /home/ehubbard/C_Checks/pid1108_2)
==6553==  If you believe this happened as a result of a stack
==6553==  overflow in your program's main thread (unlikely but
==6553==  possible), you can try to increase the size of the
==6553==  main thread stack using the --main-stacksize= flag.
==6553==  The main thread stack size used in this run was 10485760.
==6553== Stack overflow in thread 1: can't grow stack to 0xffe601ff0
==6553== 
==6553== Process terminating with default action of signal 11 (SIGSEGV)
==6553==  Access not within mapped region at address 0xFFE601FF0
==6553==    at 0x4801661: _vgnU_freeres (vg_preloaded.c:58)
==6553==  If you believe this happened as a result of a stack
==6553==  overflow in your program's main thread (unlikely but
==6553==  possible), you can try to increase the size of the
==6553==  main thread stack using the --main-stacksize= flag.
==6553==  The main thread stack size used in this run was 10485760.
==6553== 
==6553== HEAP SUMMARY:
==6553==     in use at exit: 0 bytes in 0 blocks
==6553==   total heap usage: 1 allocs, 1 frees, 568 bytes allocated
==6553== 
==6553== All heap blocks were freed -- no leaks are possible
==6553== 
==6553== For counts of detected and suppressed errors, rerun with: -v
==6553== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 4)

**GDB Error**
Program received signal SIGSEGV, Segmentation fault.
0x000000000040068f in kill ()`enter code here`
#include <stdio.h>      //Needed for standard I/O
#include <stdlib.h>     //Needed for exit
#include <sys/types.h>  //Needed for kill function
#include <signal.h>     //Needed for kill function
#include <inttypes.h>
#include <iso646.h>

int kill(pid_t pid, int sig);

int main(int argc, char *argv[])
{
    FILE *fp;
    int pid;

    fp = fopen(argv[1], "r");

    if (fp == NULL){
        printf("Pid file doesn't exist:");
        return 2;}
    else {
          fscanf(fp, "%d", &pid);
          printf("Pid number is %d", pid);
          fclose(fp);
         }
    kill(pid, 0);

}

int kill(pid_t pid, int sig)
{
    if ((kill (pid, sig)) == -1){
         printf("Pid %d is no longer valid", pid);
         return 2;
    }
    else if ((kill (pid, sig)) == 0){
         printf("Pid %d is active.", pid);
         return 0;
    }
    else{
         printf("Could not determine value!");
         return 2;
    }
}

2 个答案:

答案 0 :(得分:2)

在自定义kill中调用kill会导致无限递归。您应该调用自定义kill其他内容,例如custom_kill,然后从main调用,然后调用kill将转到正确的Unix kill(2) (如果未正确设置链接,它们将失败。)

答案 1 :(得分:0)

问题的原因是函数kill()中的无限循环(递归)。很难说,你想要做什么,但现在kill()的这个实现在第一行(if ((kill (pid, sig)) == -1){)中调用自己,并且没有条件来阻止这种无限递归。所以当系统有足够的内存来继续时,它可以工作。要修复它,你需要纠正这个函数的逻辑。

如果您尝试从自己的函数调用外部函数kill(),则更容易重命名您的函数:

int my_kill(pid_t pid, int sig)
{
  // your current code
}