Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调试fastcgi应用程序_C++_C_Ubuntu_Gdb_Fastcgi - Fatal编程技术网

C++ 调试fastcgi应用程序

C++ 调试fastcgi应用程序,c++,c,ubuntu,gdb,fastcgi,C++,C,Ubuntu,Gdb,Fastcgi,我已经在我的服务器上部署了一个fastcgi应用程序。当我试图在服务器上运行它时,它崩溃了(稍后会有更多) 首先是关于本地(dev)计算机的一些事实: 该应用程序是C/C++应用程序 我在Ubuntu10.0.4LTS(服务器上的相同操作系统)上开发了这个应用程序 在开发过程中,我使用gdb逐步完成代码以修复初始错误 我在应用程序上运行了ldd,找到了所有必需的共享库 我可以用curl在本地机器上测试它 在对代码进行测试并在本地机器上运行之后,我构建了一个发布版本,并使用Netbeans 6.9

我已经在我的服务器上部署了一个fastcgi应用程序。当我试图在服务器上运行它时,它崩溃了(稍后会有更多)

首先是关于本地(dev)计算机的一些事实:

  • 该应用程序是C/C++应用程序
  • 我在Ubuntu10.0.4LTS(服务器上的相同操作系统)上开发了这个应用程序
  • 在开发过程中,我使用gdb逐步完成代码以修复初始错误
  • 我在应用程序上运行了ldd,找到了所有必需的共享库
  • 我可以用curl在本地机器上测试它
  • 在对代码进行测试并在本地机器上运行之后,我构建了一个发布版本,并使用Netbeans 6.9 IDE对其进行了打包

    我在服务器上安装了这个包,并运行了以下测试

  • 首先在安装的应用程序上运行ldd,我注意到一些文件没有找到。我修复了这个问题,将dev机器上的文件复制到应用程序正在搜索它们的位置(可能不太理想)——但是,当我再次运行ldd时,找到了所有库

  • 然后我在控制台上运行curl来测试这个应用程序

  • 控制台上似乎有一个核心转储(即二进制流转储),而不是预期的消息

    我的问题是:

  • 有人能解释为什么ldd正确地指示所有文件(已加载?),但应用程序却崩溃了吗
  • 应用程序在我的开发机器上运行但无法在服务器上运行的最可能原因是什么
  • 由于应用程序在启动前崩溃,我不确定如何使用gdb调试应用程序-显然,在尝试调试之前,我会将调试版本复制到服务器
  • 关于上述第3点,还有进一步的复杂性。该服务器是一个精简、平庸、无头的服务器,因此没有安装gdb

    因此,即使我找到了调试应用程序的方法(在它崩溃之前),我也不知道如何连接到远程进程

    如果您有任何关于如何开始弄清真相的想法,我们将不胜感激。

    您的问题基于太多的误解

    有人能解释为什么ldd正确地指示所有文件(已加载?),但应用程序却崩溃了吗

    出于同样的原因,一些应用程序在没有任何问题的情况下运行了100次,然后“随机”崩溃

    并非所有崩溃都与动态链接器有关,事实上大多数崩溃都与动态链接器无关。其他错误,如堆损坏、缓冲区溢出、逐个关闭错误等是更常见的原因

    应用程序在我的开发机器上运行但无法在服务器上运行的最可能原因是什么

    你没有提供足够的数据来回答这个问题

    症状是什么?你看过apache错误日志了吗?什么是崩溃堆栈跟踪?服务器上缺少哪些库,哪些库被复制了

    由于应用程序在启动前崩溃,我不确定如何使用gdb调试应用程序-显然,在尝试调试之前,我会将调试版本复制到服务器


    您不需要复制调试二进制文件来调试它(这可能有帮助,也可能没有帮助,这取决于崩溃实际发生的位置)。

    根据原始海报的要求作为答案发布:

    1.您可以将核心转储复制到带有gdb的机器上,并在那里看到回溯。gdb-c core_name binary.name,然后是bt.

    2.在启动之前,您如何知道您的应用程序崩溃?开始将内容记录到文件中,而不是仅依赖于实时gdb会话。

    确保所需的
    版本。这样两台服务器上的
    文件就相同了。因此,盲目地将文件从一台机器复制到另一台机器不是保持服务器处于良好运行状态的推荐方法。1。您可以将核心转储复制到带有gdb的机器上,并在那里看到回溯。gdb-c core_name binary.name,然后是bt.2。在启动之前,您如何知道您的应用程序崩溃?开始将内容记录到文件中,而不仅仅依赖于实时gdb会话。@Torp:谢谢您的评论。我认为我朝着正确的方向前进了——但是经过一点分析,我意识到实际上是控制台上显示的文件本身的内容!(见编辑)@Torp:你能把你的评论作为答案发表吗(这样我就可以接受了)。虽然这不是确切的解决方案,但它让我走上了正确的道路,我能够解决这个问题。。。声誉ftw:)对于任何感兴趣的人。。。我试图从“转储”(实际上是通过管道将流传输到文件)运行gdb-c,gdb抗议说它不是转储文件。我在转储的文件上运行“file”,发现它是一个可执行文件。经过一点调查(使用cmp等),我意识到,我最初认为是一个核心转储,实际上是流式传输到控制台的文件内容。钱马上就掉了——我检查了我的Apache设置,意识到我还没有为fcgi设置Apache——因此Apache只是按照请求返回文件的内容!嗯。。。