我只是在单步执行程序时得到Stackoverflow异常

时间:2014-03-04 16:40:43

标签: c# pinvoke

程序在运行时运行正常,但当我尝试单步执行时,我得到:

"未处理的类型' System.StackOverflowException'发生在未知模块中。"

以下是代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace PInvokeTest
{
    class Program
    {
        static void Main(string[] args)
        {
            int session_handle = 0;
            int flag = 0;
            int didsetup = 0;
            int defPort = 0;
            int i = 0, j = -1;
            short[] ROM;
            ROM = new short[9];
            short type_test = 0;
            short port_num = 0, port_type = 1;
            byte[] state_buf = new byte[5125];
            StringBuilder ID_buf = new StringBuilder();
            StringBuilder serial = new StringBuilder();
            StringBuilder serialtmp = new StringBuilder();



            //Finds default device type and port
            defPort = TMReadDefaultPort(out port_num, out port_type);

            // get the TMEX driver version
            Get_Version(ID_buf); // STACKOVERFLOW EXCEPTION HERE

            ...

            Console.ReadKey();
        }

        [DllImport("IBFS32.dll")]
        public static extern int TMExtendedStartSession(
            short PortNum,
            short PortType,
            IntPtr EnhancedOptions
        );

        [DllImport("IBFS32.dll")]
        public static extern short TMReadDefaultPort(
            out short port_num,
            out short port_type
        );

        [DllImport("IBFS32.dll")]
        public static extern short Get_Version(
            [MarshalAs(UnmanagedType.LPStr)]StringBuilder ID_buf
        );

        [DllImport("IBFS32.dll")]
        public static extern short TMGetTypeVersion(
            short port_type,
            [MarshalAs(UnmanagedType.LPStr)]StringBuilder ID_buf
        );

        [DllImport("IBFS32.dll")]
        public static extern short TMSetup(
            int session_handle
        );

        [DllImport("IBFS32.dll")]
        public static extern short TMNext(
            int session_handle,
            byte[] state_buf
        );

        [DllImport("IBFS32.dll")]
        public static extern short TMRom(
            int session_handle,
            byte[] state_buf,
            short[] ROM
        );

        [DllImport("IBFS32.dll")]
        public static extern short TMEndSession(
            int session_handle
        );
    }
}

什么会导致它只在你没有踩踏时运行它? 我有另一个使用非常相似的代码的程序(dll函数在不同的类中),但无论它是如何运行的,它都会获得stackoverflow异常。

编辑:

当我使用这个dll的64位版本并在x64中构建我的程序时,它始终正常工作......我不知道这些信息是否对你有任何帮助。

我需要运行32位版本。

2 个答案:

答案 0 :(得分:1)

您必须指定StringBuilder的初始容量(通过构造函数),以确保它足够大以存储结果。您正在调用默认构造函数。

  

您可以传递一个System.Text.StringBuilder对象;一个指针将由编组程序传递给可以操作的非托管函数。 唯一需要注意的是StringBuilder必须为返回值分配足够的空间,否则文本会溢出,导致P / Invoke抛出异常。

Intro to P/Invoke

StringBuilder ID_buf = new StringBuilder(MaxVersionLength);

答案 1 :(得分:0)

  

什么会导致它只在你没有踩踏时运行它?

很可能您在 Release 中运行代码,但在 Debug 中跳过,在这些情况下,由于 Debug 模式期间所需的其他信息,可用堆栈大小减少,因此堆栈上用于具体代码执行的可用内存变小,这会在堆栈已满时生成堆栈溢出异常。

顺便说一句,你有一个stackoverflow危险异常,所以最好修复它,直到你在 Release 中遇到同样的问题,所以在生产中。