【问题标题】:Inconsistency between the debugger and running the program [closed]调试器和运行程序之间的不一致[关闭]
【发布时间】:2014-07-08 17:09:16
【问题描述】:

我有一个相当大的程序(这就是我不会显示代码的原因),它有一个 quit() 函数,它打印所有错误并打印退出消息,无论程序中发生什么,它都会到达 @ 987654322@ 功能。 问题是,当我运行程序时,有时它会到达所说的quit() 方法并打印退出方法,有时它没有,它会在不打印退出消息的情况下结束。我不明白为什么会发生这种情况,更奇怪的是,当我调试程序时,它总是有效。 我读到调试器具有某些功能可以减少崩溃。

你能告诉我不一致的地方是什么,我应该怎么做才能解决它。

注意:我的程序是用 C 编写的,我正在使用 Visual Studio 2013 (C++) 进行编译。

谢谢。

已解决:问题是我访问了未分配的内存(我是动态分配的,但还不够)。我的解决方案是 realloc()。

【问题讨论】:

  • 不阅读代码是不可能的......或者至少是其中的一部分
  • 备注:if (extension == ".huf")不行,需要使用strcmp()。
  • 另一个说明是那里有解析命令行的库。任何人第一次尝试这种自制代码都会出错。
  • 如果您分配例如cryptoKey = optionParameters[i]; 您更改了本地参数cryptoKey,而不是实际参数,即main 中的cryptoKey。您可以为 main 的 cryptoKey 分配空间,例如char cryptoKey[100];,并将 strcpy 分配给该地址而不是覆盖它;或者您可以将指针传递给指针并像现在一样写入 char* 本身:initializeOptions( ..., char **cryptoKeyParam, ...) { *cryptoKeyParam = optionParameters[i]; ...},使用 initializeOptions(..., &cryptoKey, ...); 从 main 调用它。
  • 您可以通过在调用 quit 函数时故意崩溃来区分两者。如果程序在quit 函数中崩溃,那么你就知道它被调用了。

标签: c visual-studio-debugging


【解决方案1】:

正如我在评论中讨论的那样,您没有在 initializeOptions() 中设置 main 的 cryptoKey。 (而是覆盖一个参数值。)如果您稍后使用该密钥(因为已设置加密方法),它将指向任意内存。

【讨论】:

  • 嗯,我在写的时候就想到了,但后来它似乎工作了,然后我觉得没问题就忘了它......好吧,我们每天都在学习。非常感谢。
  • 哦,等等,现在它可以在发布模式下工作,但不能在调试模式下......
  • 我也冒昧地更改了文件名以同样的方式工作。
【解决方案2】:

我想我知道出了什么问题,fileNames 为 char * 分配了 2 个位置,当我分配更多位置然后我给它命名时,它就可以工作了,我只需要重新分配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    相关资源
    最近更新 更多