【问题标题】:Howto Debug CgiCC App如何调试 Cgi 应用程序
【发布时间】:2011-12-26 20:03:17
【问题描述】:

我为 windows 和 linux 开发了一个 Win32 C++ cgi 应用程序并从头开始。 我使用 CgiCC 作为 lib,使用 Visual Studio 2010 作为 IDE。

我该如何调试它?我猜当我实例化我的 cgicc 类时,程序会持有并等待 CGI 输入。

如何为我的 CGI 输入设置环境?
我设置了一些环境变量,例如 QUERY_STRING。
但我不知道如何提供我的 cgi 应用程序在网络服务器上运行时会获得的值。

编辑:
我快到了。

  1. 我在浏览时捕获了流量并将该内容写入文件。
  2. 然后我将标准输入重定向到该文件:“
  3. 我在windows下设置了一些环境变量,比如CONTENT_LENGTH和CONTENT_TYPE。

之后我可以像这样从我的输入中读取一些内容:

cgicc::Cgicc cgi;
string u = cgi("user");

但我在执行此操作时遇到异常(从未分配的内存和类似的异常中读取):

vector<FormFile, allocator<FormFile>> files = cgi.getFiles();

如果加载正确,不知何故。

【问题讨论】:

    标签: c++ cgi


    【解决方案1】:

    CGI 应用通过环境变量和标准输入接收输入,因此您可以轻松复制 Web 服务器为 CGI 任务设置的环境。

    就环境变量而言,here 是属于 CGI 协议一部分的环境变量列表。我建议您通过捕获生产网络服务器提供给工作 cgi 应用程序的环境来手动或更好地设置所有这些。由于环境变量由子进程继承,如果您在 Windows 命令提示符内的环境中设置这些变量,然后从同一窗口调用 Visual Studio IDE,那么当您的 CGI 应用程序在调试器内启动时以及当您无需调试即可运行它。

    在您的情况下,获取标准输入替换可能会更复杂一些,因为您正在使用文件上传表单。 This site 包含一个模板,可以帮助您开始使用 multipart/form-data 格式。通过表单上传文件的官方文档是RFC 1867

    我希望这会有所帮助。

    【讨论】:

    • 感谢您的建议。它确实帮助了我。但解决方案是另外一回事: 1. 使用与我编译项目相同的 Visual Studio 版本构建 cgicc。 2.将cgicc构建为静态库而不是动态库。 3.在我的项目中设置预处理器定义CGICC_EXPORTS,它激活了__declspec(dllexport)。然后就成功了!
    【解决方案2】:

    自己解决了:

    1. 使用与我编译项目相同的 Visual Studio 版本构建 cgicc。
    2. 将 cgicc 构建为静态库而不是动态库。
    3. 在激活 __declspec(dllexport) 的项目中设置预处理器定义 CGICC_EXPORTS。

    然后它起作用了!

    【讨论】:

    • 嗨@juergen d,我有同样的要求。你能帮我在 Visual Studio 中建立 cgicc 库吗?如果您可以分享在 Visual Studio 中构建 cgicc 库的步骤,那就太好了。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 2013-06-22
    • 2023-03-02
    • 2011-10-21
    • 2019-01-06
    • 2013-08-15
    相关资源
    最近更新 更多