如何调试Office.js+;Excel 2016崩溃

如何调试Office.js+;Excel 2016崩溃,excel,typescript,office-js,Excel,Typescript,Office Js,(重写这篇文章的全文。请检查以前版本的编辑历史记录) 所需帮助: 我的Office.js项目经常遇到Excel(桌面)崩溃 即使在VS中启用了所有异常断点,也会崩溃 似乎是随机崩溃的 在EventViewer中只有APPCRASH日志 代码在Excel Online中运行良好 需要关于Office.js开发更好的工作流(调试崩溃)的建议 我的环境: Typescript@2.3.2 核心-js@2.4.1(承诺polyfill) Visual Studio 2015(更新3) Excel 201

(重写这篇文章的全文。请检查以前版本的编辑历史记录)

所需帮助:

  • 我的Office.js项目经常遇到Excel(桌面)崩溃
  • 即使在VS中启用了所有异常断点,也会崩溃
  • 似乎是随机崩溃的
  • 在EventViewer中只有APPCRASH日志
  • 代码在Excel Online中运行良好
  • 需要关于Office.js开发更好的工作流(调试崩溃)的建议
  • 我的环境:

  • Typescript@2.3.2
  • 核心-js@2.4.1(承诺polyfill)
  • Visual Studio 2015(更新3)
  • Excel 2016 Pro Plus-1703(构建7967.2139)
  • 我终于把我的代码简化成了一个简单的例子

  • 在不同的迭代中崩溃(例如,第1次、第6次等)
  • 如果我注释掉任何一行(在
    //TEST1
    //TEST2
    ),那么代码将一直运行到完成(在代码更改后必须完全重新启动Excel)
  • 代码:

    //Office.js入口点
    Office.initialize=异步函数(原因){
    log(“Office.JS已初始化!”);
    控制台日志(“测试启动”);
    对于(var i=0;i{
    //==设置============
    常数工作表=等待设置(ctx);
    //==运行============
    //要删除的范围
    常量范围=等待工作表.getRange(“B1:B2”);
    ctx.trackedObjects.add(范围);
    等待ctx.sync();
    //从范围中获取整行
    const entireRow=range.getEntireRow();
    entireRow.load(“地址”);
    等待ctx.sync();
    ctx.trackedObjects.add(entireRow);
    //删除整行
    log(`Deleting:${entireRow.address}`);
    entireRow.delete(Excel.DeleteShiftDirection.up);
    等待ctx.sync();
    //==清理============
    等待拆卸(ctx,工作表);
    });
    }
    //测试:给定一个范围,转换为表
    异步函数ConvertToListObjectTest():Promise{
    等待Excel.run(异步ctx=>{
    //==设置============
    常数工作表=等待设置(ctx);
    //==运行============
    //要转换的Ger范围
    常量范围=工作表.getRange(“B3:E20”);
    ctx.trackedObjects.add(范围);
    //转换为表格
    const table=工作表.tables.add(范围,true);
    ctx.trackedObjects.add(表);
    等待ctx.sync();
    //检查表名
    表1.荷载(“名称”);
    等待ctx.sync();
    console.log(“添加的表:+Table.name”);
    //==清理============
    等待拆卸(ctx,工作表);
    });
    }
    
    因为没有崩溃信息,VisualStudio中也没有崩溃信息,所以我不知道何时/何地/是什么导致了崩溃

    为了给出这个简单的示例,我不得不逐行注释代码,重新编译,重新运行,崩溃,重复

    这是一个极其痛苦的隔离违规代码的过程

    所以我的最后一个问题是:


    开发office.js项目是否有更好的方法/工作流程?特别是在处理bug时,无论是我的代码、office.js还是Excel本身?

    让我四处问问,我们会给你回复的。@MichaelZlatkovsky Microsoft谢谢。如果有帮助的话,我最近用代码更新了我的问题。
    // Office.js entry point
    Office.initialize = async function (reason) {
    
        console.log("Office.JS initialized!");
        console.log("Test Start");
        for(var i=0; i<100; i++) {
            console.log(`Iteration ${i}`);
    
            await ConvertToListObjectTest(); // TEST1
            await DeleteEntireRowTest();     // TEST2
        }
        console.log("Test End");
    
    }
    
    // Setup: Generates and activates a random, test worksheet
    async function Setup(ctx: Excel.RequestContext): Promise<Excel.Worksheet> {
    
        // Create
        const sheetName = `Sheet${+new Date}`;
        const worksheet = ctx.workbook.worksheets.add(sheetName);
        ctx.trackedObjects.add(worksheet);
    
        // Activate
        worksheet.activate();
        await ctx.sync();
    
        return worksheet;
    }
    
    // TearDown: Cleanup test worksheet
    async function TearDown(ctx:Excel.RequestContext, worksheet: Excel.Worksheet): Promise<void> {
        worksheet.delete();
        await ctx.sync();
    }
    
    // Test deleting entire rows, given a range
    async function DeleteEntireRowTest(): Promise<void> {
    
        await Excel.run( async ctx=> {
            // == SETUP ============
            const worksheet = await Setup(ctx);
    
            // == RUN ============
            // Range to delete
            const range = await worksheet.getRange("B1:B2");
            ctx.trackedObjects.add(range);
            await ctx.sync();
    
            // Get entire rows from range
            const entireRow = range.getEntireRow();
            entireRow.load("address");
            await ctx.sync();
            ctx.trackedObjects.add(entireRow);
    
            // Delete entire rows
            console.log(`Deleting: ${entireRow.address}`);
            entireRow.delete(Excel.DeleteShiftDirection.up);
            await ctx.sync();
    
            // == CLEAN UP ============
            await TearDown(ctx, worksheet);
        });
    }
    
    // Test: Given a range, convert to table
    async function ConvertToListObjectTest(): Promise<void> {
    
        await Excel.run( async ctx => {
            // == SETUP ============
            const worksheet = await Setup(ctx);
    
            // == RUN ============
    
            // Ger range to convert
            const range = worksheet.getRange("B3:E20");
            ctx.trackedObjects.add(range);
    
            // Convert to table
            const table = worksheet.tables.add(range, true);
            ctx.trackedObjects.add(table);
            await ctx.sync();
    
            // Check table name
            table.load("name");
            await ctx.sync();
            console.log("Table added: " + table.name);
    
            // == CLEAN UP ============
            await TearDown(ctx, worksheet);
        });
    }