代码之家  ›  专栏  ›  技术社区  ›  Esteban Brenes

两台机器上的相同源代码产生不同的可执行行为

  •  1
  • Esteban Brenes  · 技术社区  · 16 年前

    下面是场景:

    存储在SVN中的C Windows应用程序项目用于创建可执行文件。通常,构建服务器处理构建过程,并定期创建测试使用的构建。在这个特定的实例中,我被要求修改特定的构建并创建可执行文件。

    我不完全确定构建服务器是否修改了项目文件,但我知道它在SVN中创建了一个标记,标记是用来编译可执行文件的源代码。使用这个标签,我已经在第二台机器上签出了代码,这是一台开发机器。然后我在开发机器上编译了源代码。

    执行时,在开发计算机上编译的应用程序的功能与生成服务器编译的应用程序不完全相同。例如,在测试机器上,应用程序检测到一个日期时间分析执行。但是,生成机器的可执行文件不会抛出任何异常。如果我在开发机器上运行可执行文件,就不会抛出异常。

    所以总的来说,两台机器理论上都使用相同的源代码和项目。
    开发机器的可执行文件只在开发机器上工作。构建机器的可执行文件可以在每台机器上工作,包括dev机器。

    机器的区域设置或时区是否存储在已编译的可执行文件中?知道什么会导致这种行为,或者如何检查可执行文件以发现可能的差异并纠正它们吗?

    不幸的是,我不能使用一台测试机器并将调试程序附加到它上。我会尽快的。

    9 回复  |  直到 16 年前
        1
  •  4
  •   David Thibault    16 年前

    这个应用程序使用它运行的机器的区域设置,看起来这是你的问题。通过将System.Threading.Thread.CurrentThread.CurrentCulture和System.Threading.Thread.CurrentThread.CurrentUICulture设置为特定值,可以强制线程使用特定的区域性。

        2
  •  2
  •   theo    16 年前

    这两台机器有可能具有不同版本的底层DLL,而该版本不是构建过程的一部分。我已经看到在我们的内部服务器场中分发服务时会发生这种情况。

        3
  •  1
  •   Michael Burr    16 年前

    可以在调试器下的生成计算机上运行该程序吗?

    如果是,则调试问题- 不用猜了 .

    让开发人员计算机上的调试器捕获异常,在生成计算机上的同一位置设置断点。看看这两者有什么不同。

        4
  •  1
  •   Mark    16 年前

    我在XP上看到了不同的“区域和语言选项”,这导致了这种行为。这两台机器都配吗?启动设置控制面板区域和语言选项…

        5
  •  1
  •   typemismatch    16 年前

    我有几个问题-两台机器都有相同的区域设置吗?您的错误日志在哪里?我希望;-)您有正在处理和写入磁盘、事件日志的异常。有助于解决此类问题。

    这个日期是从哪里来的呢?如果它在你的数据库中,也许你也有坏数据。

        6
  •  0
  •   Mori    16 年前

    我曾经遇到过类似的问题(除了C++),当我比较编译后的可执行文件的大小时,它们已经过时了。不幸的是,经过几天的搜索,我找到的最佳解决方案是卸载VS05并重新安装它。

        7
  •  0
  •   akauppi    16 年前

    如果我可以问的话,你为什么要用构建服务器来实现C代码呢?

    当我使用C时,它的构建时间几乎不明显(<2s)。这个应用程序真的那么大吗?

        8
  •  0
  •   rmeeuwisse    16 年前

    构建系统可能生成一个发布版本,而在dev pc上的手动构建则生成一个调试版本。调试版本签入时出错更多。看看您是否可以手动构建一个发布版本,看看是否仍然存在差异。

        9
  •  0
  •   old_timer    16 年前

    如果每个人在不同的计算机上构建相同的程序,那么相同的源代码很少。你应该总是假设程序是不同的,不要期望它们是相同的。在一个像Linux这样的环境中,有一个好的包管理器和定期或随机的更新,也不要期望相同的源代码在同一台计算机上构建相同的程序。语言越高,越糟糕。为调试器生成程序与为发布而生成程序大不相同。即使没有调试器,调试器版本也会隐藏直到进入发布版本时才会发现的错误。如果过分依赖调试器环境,基本上可以调试程序两次。