0

我有一个对我来说似乎很奇怪的情况。我在 C# 中有一个 WCF Web 服务,我在其中写入了一些调试代码,它打开一个文件并写入一些关于当前变量值的行并关闭文件。这是我关闭和打开的一项功能,具体取决于我是否需要使用它来调试客户位置的某些东西。

对于所有读取和写入功能,它与在后台执行 COBOL 代码以访问旧数据存储系统的 DLL 交互。所有的变量都是通过引用传入的,返回的数据是通过那些相同的引用变量返回的。大多数时候,变量只是初始化为正确的大小并传入并将数据返回给我。函数的返回类型是 COBOL 环境中的所有执行状态,告诉您程序是否未加载/初始化正常,执行是否正常等。所有写入都返回 0 成功和 -1 失败。

在我对这个 DLL 的所有调用之前和之后,我都有我的调试代码,所以我可以看到之前和之后的值。调试函数只是在 FileStream 中写入一行并返回。我确实将相同的变量按值传递给调试函数,我将这些变量作为引用传递给我的工作函数。

当我打开调试开关时,奇怪的事情开始发生。在 1-2 次调用之后,worker 函数在成功/失败代码中继续保持值为 0。当然,我的逻辑认为 0 是对数据文件的成功写入,所以我错误地报告写入工作正常。调试 dll,您可以明确看到它返回 -1,试图通知 Web 服务写入失败,在我的情况下这是正确的,因为发生了重复的密钥违规。当值出现在 Visual Studio 手表中时,它不知何故变成了 0,表示成功。

我无法思考的是,如果我关闭调试开关。这会关闭我的 FileStream 编写器,我通过值传递变量,然后通过引用传递给我的工作函数,一切都按应有的方式工作。Dll 中的值应正确显示成功/失败。为什么返回值会被破坏对我来说毫无意义。

我还没有尝试将所有变量复制到临时保存变量并将不同的变量传递给调试和工作函数。问题是,我不明白为什么这个价值被破坏了。它正在更改,因为我将值初始化为 -99,但它总是返回为 0,而在我的测试用例中它应该返回 -1。

在此先感谢,希望有人可以建议如何跟踪 Dll 返回和在 Visual Studio 手表中显示之间的变量,这似乎是值被损坏的地方,或者知道为什么我的调试操作可能会以某种方式损坏返回价值。

private UploadStatus SetRecord(int remoteId, string xmlDate, string val1, string val2, int val3, int recSeq, string name, int cat1, int cat, int seq, string val5, double val6)
{
    UploadStatus status = new UploadStatus();
    status.id = remoteId;
    int RtnCode = -99;
    int countRecSeq = Convert.ToInt16(ConfigurationManager.AppSettings["cycle-value"]); // value to cycle through for unique key

     // Pad variables appropriately
     val1 = val1 .PadRight(6, ' ');
     val2 = val2 .PadRight(3, ' ');
     val3 = val3 .PadRight(30, ' ');
     xmlDate = xmlDate.PadRight(25, ' ');
     val5 = val5.PadLeft(2, ' ');

     errorTypes ErrCode;
     try
     {

     if (debug)
     {
         string input = "remoteId: " + remoteId + "||\n" + "xmlDate: " + xmlDate + "||\n" + "val1: " + val1 + "||\n" + "val2: " + val2+ "||\n" + "val3: " + val3 + "||\n" + "recSeq: " + recSeq + "||\n" + "name: " + name + "||\n" + "cat1: " + cat1 + "||\n" + "cat: " + cat + "||\n" + "val4: " + val4 + "||\n" + "val5: " + val5 + "||\n" + "val6: " + val6 + "||\n" + "RtnCode: " + RtnCode + "||\n";
         writeDebug("\n\n*** Start UploadStatus SetRecord(int remoteId, string xmlDate, string val1, string val2, int val3, int recSeq, string name, int cat1, int cat, int val4, string val5, double val6) ***\n" + input);
      }
      ErrCode = COBOL.SET_RECORD(ref xmlDate, ref val1, ref val2, ref val3, ref recSeq, ref name, ref cat1, ref cat, ref val4, ref val5, ref val6, " ", ref RtnCode);
      // Add to recSeq looking for a unique key to insert
      while (ErrCode == errorTypes.CS_OK && recSeq < countRecSeq && RtnCode == -1)
      { ...


private void writeDebug(string input)
{
    string logText = DateTime.Now.ToShortDateString() + " " + DateTime.Now.TimeOfDay.ToString() + ": " + input;
    try
    {
        if (!File.Exists(debugPath))
        {
            using (StreamWriter sw = File.CreateText(debugPath))
            {
                sw.Write(logText);
            }
        }
        else
        {
            using (StreamWriter sw = File.AppendText(debugPath))
            {
                sw.Write(logText);
            }     
        }
     }
     catch (Exception ex)
     {
         writeException(ex);
     }
 }
4

1 回答 1

0

最终,我解决了这种情况。最初,如果用于写入数据的键与另一个键匹配,则该函数将返回失败。在该代码中,我们只是将其开发为递增到下一个键。问题可能仍然存在,但由于该功能最终会找到要使用的密钥,因此它总是成功的。

此后,供应商对 COBOL 和 .NET 互操作进行了改进。此外,我们完全改变了我们在语言之间进行交流的方式,这似乎更加稳定。

于 2014-03-21T13:22:22.480 回答