Skip to content

node 10.0.0 with ts-node throws a TypeError in isInsideNodeModules when an error is thrown by user code #20258

Description

@mdouglass
  • Version: v10.0.0
  • Platform: Darwin bigbird.local 17.5.0 Darwin Kernel Version 17.5.0: Mon Mar 5 22:24:32 PST 2018; root:xnu-4570.51.1~1/RELEASE_X86_64 x86_64

Attached sample project (which is a single ts file with just throw new Error()) when run via npm start fails with:

mdouglass$ npm start

> temp@1.0.0 start /Users/mdouglass/kixeye/km/server/temp
> ts-node index.ts

internal/util.js:360
    const filename = frame.getFileName();
                           ^

TypeError: frame.getFileName is not a function
    at isInsideNodeModules (internal/util.js:360:28)
    at showFlaggedDeprecation (buffer.js:149:8)
    at new Buffer (buffer.js:174:3)
    at Array.<anonymous> (/Users/mdouglass/kixeye/km/server/temp/node_modules/source-map-support/source-map-support.js:163:21)
    at /Users/mdouglass/kixeye/km/server/temp/node_modules/source-map-support/source-map-support.js:53:24
    at mapSourcePosition (/Users/mdouglass/kixeye/km/server/temp/node_modules/source-map-support/source-map-support.js:185:21)
    at wrapCallSite (/Users/mdouglass/kixeye/km/server/temp/node_modules/source-map-support/source-map-support.js:357:20)
    at /Users/mdouglass/kixeye/km/server/temp/node_modules/source-map-support/source-map-support.js:392:26
    at Array.map (<anonymous>)
    at Function.prepareStackTrace (/Users/mdouglass/kixeye/km/server/temp/node_modules/source-map-support/source-map-support.js:391:24)

repro-nodejs-10-throw.zip

Activity

  1. jasnell commented on Apr 24, 2018

    @jasnell
    Member

    Ping @addaleax ... any ideas?

  2. jasnell commented on Apr 24, 2018

    @jasnell
    Member

    This is possibly a bad interaction with make-error but I need to verify
    I take that back... https://github.com/evanw/node-source-map-support/blob/master/source-map-support.js looks like a better candidate...

    (heh... it would help if I actually read the entire stack track ... lol...)

  3. apapirovski commented on Apr 24, 2018

    @apapirovski
    Contributor

    I'm looking into this but anyone else is also welcome to dig in.

  4. tirthamazumdar commented on Apr 24, 2018

    @tirthamazumdar

    I do have the same issue. Just now upgraded to 10.0.0 from version 8, and all my tests are failing.

    internal/util.js:360
    const filename = frame.getFileName();
    ^
    TypeError: frame.getFileName is not a function
    at isInsideNodeModules (internal/util.js:360:28)
    at showFlaggedDeprecation (buffer.js:149:8)
    at new Buffer (buffer.js:174:3)

  5. jasnell commented on Apr 24, 2018

    @jasnell
    Member

    @tirthamazumdar ... are you also using source-map-support?

  6. apapirovski commented on Apr 24, 2018

    @apapirovski
    Contributor

    @jasnell It just comes with ts-node. source-map-support is definitely what's causing it but still not sure how to resolve.

  7. tirthamazumdar commented on Apr 24, 2018

    @tirthamazumdar

    @jasnell yes I am also using source-map-support.. Just now compiled typescript into javascript and the running directly the javascript tests the problem goes away.
    Looks like issue is with source-map-support

  8. jasnell commented on Apr 24, 2018

    @jasnell
    Member

    Ok, @apapirovski @addaleax ... looks like the transpiler here is mucking around with the generation of the stack frames in a way the check in core did not anticipate. I think we should likely do in this case is have isInsideNodeModules() return false if it cannot reliably process the stack. That would cause the Buffer deprecation warning to emit in this case, but that's not really a bad thing.

  9. added
    bufferIssues and PRs related to the buffer subsystem.
    on Apr 24, 2018
  10. jasnell commented on Apr 24, 2018

    @jasnell
    Member

    Attempting to put together a standalone repo test case now but not having much luck yet.

  11. apapirovski commented on Apr 24, 2018

    @apapirovski
    Contributor

    @jasnell Here's the simplest possible reproduction:

    Error.prepareStackTrace = (err, trace) => new Buffer();
    
    new Error().stack;
    

    The error happens because V8 won't call prepareStackTrace if it's already preparing a stack trace (recursive call). I don't think we can fix so, as you said, we'll just have to skip the check and emit the warning in those cases.

    PR coming up.

  12. addaleax commented on Apr 24, 2018

    @addaleax
    Member

    Ouch. Yes, that makes sense – thanks for figuring this out so quick. I am surprised though, it might be nice if V8 supported this – after all, the other Error object does come from a difference VM Context, so one wouldn’t expect that kind of interaction … @nodejs/v8?

  13. jasnell commented on Apr 24, 2018

    @jasnell
    Member

    I had seen the Buffer use there but hadn't realized it was a recursive check. Good catch.

  14. bnoordhuis commented on Apr 24, 2018

    @bnoordhuis
    Member

    the other Error object does come from a difference VM Context

    Not sure I follow. If it's about @apapirovski's test case, what other Error object and VM context?

  15. apapirovski commented on Apr 24, 2018

    @apapirovski
    Contributor

    Not sure I follow. If it's about @apapirovski's test case, what other Error object and VM context?

    isInsideNodeModules generates a stack-trace yielding function in a VM to get the proper stack trace. See lib/internal/util.js around line ~340. It also uses prepareStackTrace which in V8 is guarded against being called recursively

  16. 3 remaining items

  17. apapirovski commented on Apr 24, 2018

    @apapirovski
    Contributor

    I think maybe having https://github.com/evanw/node-source-map-support in there would've caught it? But I haven't checked the test suite.

    Edit: Yep, would've caught it:

      28 passing (1s)
      1 failing
    
      1)  should allow for runtime inline source maps:
    
          AssertionError [ERR_ASSERTION]: 'TypeError: frame.getFileName is not a function' == 'Error: this is the error'
    
  18. apapirovski commented on Apr 24, 2018

    @apapirovski
    Contributor

    Thinking about it more, it's probably not the worst module to add. There are a few less common APIs exercised in their module & test suite.

  19. Trott commented on Apr 24, 2018

    @Trott
    Member

    I think maybe having https://github.com/evanw/node-source-map-support in there would've caught it? But I haven't checked the test suite.

    Edit: Yep, would've caught it:

    @nodejs/citgm ☝️

  20. richardlau commented on Apr 25, 2018

    @richardlau
    Member

    I think maybe having https://github.com/evanw/node-source-map-support in there would've caught it? But I haven't checked the test suite.

    Edit: Yep, would've caught it:

    @nodejs/citgm ☝️

    Pull requests welcome over at https://github.com/nodejs/citgm. Please make sure to document in the PR the fulfilled hard and soft requirements met by the module in question as per: https://github.com/nodejs/citgm/blob/master/CONTRIBUTING.md#submitting-a-module-to-citgm

  21. bnoordhuis commented on Apr 25, 2018

    @bnoordhuis
    Member

    It’s a different context, and while I get the intention on V8’s side, this does seem surprising; it’s not like it’s recusing into the same prepareStackTrace function here as the outer one.

    Okay, I get it now. Wouldn't be terribly hard to fix in V8 at the cost of some additional complexity (tracking the entered contexts.)

    That said, the goal of isInsideNodeModules() is to find the first non-core stack frame and there are arguably better ways of doing that than using a custom Error.prepareStackTrace.

    Strawman: capture the stack trace with v8::StackTrace::CurrentStackTrace() and find the first frame with a script id that isn't of a built-in module.

    We don't currently record our own script ids but that's relatively straightforward to add.

  22. jy95 commented on Apr 29, 2018

    @jy95
    Contributor

    I found related to source-map-support in my broken build : https://travis-ci.org/jy95/mediaScan/jobs/372789737#L517

  23. yoav-zibin commented on May 4, 2018

    @yoav-zibin

    What's the solution?

    $ node -v
    v10.0.0
    $ npm -v
    6.0.0

    TypeError: frame.getFileName is not a function
    at isInsideNodeModules (internal/util.js:360:28)
    at showFlaggedDeprecation (buffer.js:149:8)
    at new Buffer (buffer.js:174:3)
    at Array. (/Users/yzibin/GitHub/NewGamePortal/node_modules/source-map-support/source-map-support.js:149:21)
    at /Users/yzibin/GitHub/NewGamePortal/node_modules/source-map-support/source-map-support.js:53:24
    at mapSourcePosition (/Users/yzibin/GitHub/NewGamePortal/node_modules/source-map-support/source-map-support.js:171:21)
    at wrapCallSite (/Users/yzibin/GitHub/NewGamePortal/node_modules/source-map-support/source-map-support.js:343:2

  24. hashseed commented on May 4, 2018

    @hashseed
    Member

    V8 only has a single flag for checking whether prepareStackTrace is recursing. Are you saying having the flag per context or stored on the prepareStackTrace function itself would solve this? @schuay

  25. apapirovski commented on May 5, 2018

    @apapirovski
    Contributor

    @yoav-zibin 10.1.0 should come out soon and have a fix for it.

  26. mariusvw commented on May 11, 2018

    @mariusvw

    Just upgraded, can confirm that after upgrading to 10.1.0 everything works alright on our machines.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bufferIssues and PRs related to the buffer subsystem.confirmed-bugIssues and PRs for confirmed bugs.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions