mirror of
https://github.com/servo/servo.git
synced 2025-08-01 03:30:33 +01:00
Auto merge of #27042 - KallynGowdy:js-backtrace-build-fix, r=jdm
Fix building with --feature js_backtrace This PR fixes an build error that I ran into when using the `--features js_backtrace` flag. In particular, the error I ran into was this: ``` error[E0061]: this function takes 2 arguments but 1 argument was supplied --> components\script\dom\bindings\error.rs:113:45 | 113 | let js_stack = stack.and_then(|s| s.as_string(None)); | ^^^^^^^^^ ---- supplied 1 argument | | | expected 2 arguments ``` It seems that the `mozjs` crate updated the [`as_string()` method on `CapturedJSStack`](https://doc.servo.org/mozjs/rust/struct.CapturedJSStack.html#method.as_string) to take two parameters. I've chosen to use `StackFormat::Default` because that will presumably preserve the original intended behavior. I additionally had to make the block wrapping the feature unsafe as I ran into a "must be marked as unsafe to call unsafe code" build error after fixing the above issue. Seems that this commit (0703a1ad6d
) forgot that part. #### Other Notes After these changes, I was able to build but ran into an access violation error during runtime. When a JS error hit [`throw_dom_exception()`](https://github.com/servo/servo/blob/master/components/script/dom/bindings/error.rs#L109) and the JS stack was pulled, some sort of issue was hit inside mozjs and [`MOZ_NoReturn()`](bdccbdc656/mozjs/mfbt/Assertions.h (L235)
) was called, which will obviously cause an issue. It is worth noting that this only happened on my test platform (Hololens 2) and not on MacOS or in the Hololens 2 emulator. Additionally, the debug logs were not particularly helpful at identifying the culprit. Maybe it is worth making a full issue for? Here's the full details: Error message: ``` Exception thrown at 0x00007FFBCDD16784 (simpleservo.dll) in ServoApp.exe: 0xC0000005: Access violation writing location 0x0000000000000000. ``` Stack Trace: ``` simpleservo.dll!MOZ_NoReturn(int aLine) Line 236 at E:\Projects\Yeti\servo\target\aarch64-uwp-windows-msvc\debug\build\mozjs_sys-aa48eb6c20c205d4\out\build\dist\include\mozilla\Assertions.h(236) simpleservo.dll!js::SavedStacks::insertFrames(JSContext * cx, JS::MutableHandle<js::SavedFrame *> frame, mozilla::Variant<JS::AllFrames,JS::MaxFrames,JS::FirstSubsumedFrame> && capture) Line 0 at E:\.cargo\git\checkouts\mozjs-fa11ffc7d4f1cc2d\9a6d8fc\mozjs\js\src\vm\SavedStacks.cpp(0) simpleservo.dll!js::SavedStacks::saveCurrentStack(JSContext * cx, JS::MutableHandle<js::SavedFrame *> frame, mozilla::Variant<JS::AllFrames,JS::MaxFrames,JS::FirstSubsumedFrame> && capture) Line 1292 at E:\.cargo\git\checkouts\mozjs-fa11ffc7d4f1cc2d\9a6d8fc\mozjs\js\src\vm\SavedStacks.cpp(1292) simpleservo.dll!JS::CaptureCurrentStack(JSContext * cx, JS::MutableHandle<JSObject *> stackp, mozilla::Variant<JS::AllFrames,JS::MaxFrames,JS::FirstSubsumedFrame> && capture) Line 5926 at E:\.cargo\git\checkouts\mozjs-fa11ffc7d4f1cc2d\9a6d8fc\mozjs\js\src\jsapi.cpp(5926) simpleservo.dll!mozjs::rust::CapturedJSStack::new(mozjs::rust::RootedGuard<mut mozjs_sys::generated::root::JSObject*> cx, core::option::Option<u32> guard) Line 1337 at E:\.cargo\git\checkouts\rust-mozjs-8611526964119dd6\28248e1\src\rust.rs(1337) simpleservo.dll!script::dom::bindings::error::throw_dom_exception(script::script_runtime::JSContext cx, script::dom::globalscope::GlobalScope * global, script::dom::bindings::error::Error result) Line 114 at E:\Projects\Yeti\servo\components\script\dom\bindings\error.rs(114) ``` Repro: 1. Make a build on Windows for the Hololens 2. - This is the command I used: `C:\Python27\python.exe mach build -d --uwp --win-arm64 --features js_backtrace` 2. Open the project in Visual Studio. 3. Change the default URL in `DefaultUrl.h` to `"http://yeticgi.casualos.com/?story=test1&pagePortal=home"`. - Note the lack of HTTPS. There's a separate issue that causes a websocket error. Was trying to debug when I ran into this issue. - The same issue occurs if you load from a build of this [this repository](https://github.com/casual-simulation/casualos). Follow the instructions in [`DEVELOPERS.md`](https://github.com/casual-simulation/casualos/blob/develop/DEVELOPERS.md) if you do. 2. Run on the [Hololens 2 via Visual Studio](https://docs.microsoft.com/en-us/windows/mixed-reality/using-visual-studio#deploying-an-app-over-wi-fi---hololens-2). - If the default URL doesn't take effect, you may have to uninstall the app from the Hololens 2 and reinstall. 3. Wait for it to load and stop at a breakpoint for `SavedStacks.cpp`. - It will say the source cannot be found but its actually because the breakpoint doesn't have a related line in the source code. - If you continue then it will run into the access violation exception. --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `___` with appropriate data: --> - [x] `./mach build -d` does not report any errors - [x] `./mach test-tidy` does not report any errors <!-- Either: --> - [ ] There are tests for these changes OR - [x] These changes do not require tests because they fix a build error. <!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.--> <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->
This commit is contained in:
commit
0916ae3b3a
1 changed files with 4 additions and 2 deletions
|
@ -23,6 +23,8 @@ use js::jsapi::ExceptionStackBehavior;
|
|||
use js::jsapi::JSContext;
|
||||
use js::jsapi::JS_ClearPendingException;
|
||||
use js::jsapi::JS_IsExceptionPending;
|
||||
#[cfg(feature = "js_backtrace")]
|
||||
use js::jsapi::StackFormat as JSStackFormat;
|
||||
use js::jsval::UndefinedValue;
|
||||
use js::rust::wrappers::JS_ErrorFromException;
|
||||
use js::rust::wrappers::JS_GetPendingException;
|
||||
|
@ -108,9 +110,9 @@ pub type ErrorResult = Fallible<()>;
|
|||
/// Set a pending exception for the given `result` on `cx`.
|
||||
pub fn throw_dom_exception(cx: SafeJSContext, global: &GlobalScope, result: Error) {
|
||||
#[cfg(feature = "js_backtrace")]
|
||||
{
|
||||
unsafe {
|
||||
capture_stack!(in(*cx) let stack);
|
||||
let js_stack = stack.and_then(|s| s.as_string(None));
|
||||
let js_stack = stack.and_then(|s| s.as_string(None, JSStackFormat::Default));
|
||||
let rust_stack = Backtrace::new();
|
||||
LAST_EXCEPTION_BACKTRACE.with(|backtrace| {
|
||||
*backtrace.borrow_mut() = Some((js_stack, format!("{:?}", rust_stack)));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue