Skip to content

Commit

Permalink
Add emscripten_console_trace and emscripten_dbg_backtrace. NFC
Browse files Browse the repository at this point in the history
These are very useful for debugging.  The former simply maps directly
to `console.trace`.  The latter use `dbg()` so it writes directly to
stderr under node (better for multi-threaded apps).
  • Loading branch information
sbc100 committed Aug 29, 2024
1 parent a19f7df commit 7d44248
Show file tree
Hide file tree
Showing 8 changed files with 42 additions and 3 deletions.
4 changes: 4 additions & 0 deletions ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,10 @@ See docs/process.md for more on how version tagging works.
-----------------------
- Added support for WebGL extensions EXT_clip_control, EXT_depth_clamp,
EXT_polygon_offset_clamp and WEBGL_polygon_mode (#20841)
- New `emscripten_console_trace` and `emscripten_dbg_backtrace` APIs we were
added to `console.h`. The former simply maps directly to `console.trace`.
The latter use `dbg()` so it writes directly to stderr under node (better for
multi-threaded apps).

3.1.65 - 08/22/24
-----------------
Expand Down
11 changes: 11 additions & 0 deletions src/library.js
Original file line number Diff line number Diff line change
Expand Up @@ -2062,6 +2062,10 @@ addToLibrary({
emscripten_dbgn: (str, len) => dbg(UTF8ToString(str, len)),
#endif
emscripten_dbg_backtrace: (str) => {
dbg(UTF8ToString(str) + '\n' + new Error().stack);
},
// Use program_invocation_short_name and program_invocation_name in compiled
// programs. This function is for implementing them.
_emscripten_get_progname__deps: ['$getExecutableName', '$stringToUTF8'],
Expand Down Expand Up @@ -2090,6 +2094,13 @@ addToLibrary({
console.error(UTF8ToString(str));
},
emscripten_console_trace: (str) => {
#if ASSERTIONS
assert(typeof str == 'number');
#endif
console.trace(UTF8ToString(str));
},
emscripten_throw_number: (number) => {
throw number;
},
Expand Down
4 changes: 4 additions & 0 deletions system/include/emscripten/console.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ extern "C" {
void emscripten_console_log(const char *utf8String __attribute__((nonnull)));
void emscripten_console_warn(const char *utf8String __attribute__((nonnull)));
void emscripten_console_error(const char *utf8String __attribute__((nonnull)));
void emscripten_console_trace(const char *utf8String __attribute__((nonnull)));

// Write to the out(), err() and dbg() JS functions directly.
// These are defined an defined in shell.js and have different behavior compared
Expand All @@ -27,6 +28,7 @@ void emscripten_console_error(const char *utf8String __attribute__((nonnull)));
void emscripten_out(const char *utf8String __attribute__((nonnull)));
void emscripten_err(const char *utf8String __attribute__((nonnull)));
void emscripten_dbg(const char *utf8String __attribute__((nonnull)));
void emscripten_dbg_backtrace(const char *utf8String __attribute__((nonnull)));

// Same as above but only with the length of string specified by the second
// argument. This allows for non-NULL-terminated strings to be passed.
Expand All @@ -43,9 +45,11 @@ void emscripten_dbgn(const char *utf8String __attribute__((nonnull)), size_t len
void emscripten_console_logf(const char *format __attribute__((nonnull)), ...) __attribute__((__format__(printf, 1, 2)));
void emscripten_console_warnf(const char *format __attribute__((nonnull)), ...) __attribute__((__format__(printf, 1, 2)));
void emscripten_console_errorf(const char *format __attribute__((nonnull)), ...)__attribute__((__format__(printf, 1, 2)));
void emscripten_console_tracef(const char *format __attribute__((nonnull)), ...)__attribute__((__format__(printf, 1, 2)));
void emscripten_outf(const char *format __attribute__((nonnull)), ...) __attribute__((__format__(printf, 1, 2)));
void emscripten_errf(const char *format __attribute__((nonnull)), ...) __attribute__((__format__(printf, 1, 2)));
void emscripten_dbgf(const char *format __attribute__((nonnull)), ...) __attribute__((__format__(printf, 1, 2)));
void emscripten_dbg_backtracef(const char *format __attribute__((nonnull)), ...) __attribute__((__format__(printf, 1, 2)));

// Legacy/internal names for the above
#define _emscripten_outf(format, ...) emscripten_outf(format, ##__VA_ARGS__)
Expand Down
14 changes: 14 additions & 0 deletions system/lib/libc/emscripten_console.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,13 @@ void emscripten_console_warnf(const char* fmt, ...) {
va_end(ap);
}

void emscripten_console_tracef(const char* fmt, ...) {
va_list ap;
va_start(ap, fmt);
vlogf(fmt, ap, &emscripten_console_trace);
va_end(ap);
}

void emscripten_outf(const char* fmt, ...) {
va_list ap;
va_start(ap, fmt);
Expand All @@ -62,4 +69,11 @@ void emscripten_dbgf(const char* fmt, ...) {
vlogf(fmt, ap, &emscripten_dbg);
va_end(ap);
}

void emscripten_dbg_backtracef(const char* fmt, ...) {
va_list ap;
va_start(ap, fmt);
vlogf(fmt, ap, &emscripten_dbg_backtrace);
va_end(ap);
}
#endif
4 changes: 2 additions & 2 deletions test/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -1480,9 +1480,9 @@ def assertContained(self, values, string, additional_info='', regex=False):

if regex:
if type(values) is str:
self.assertTrue(re.search(values, string), 'Expected regex "%s" to match on:\n%s' % (values, string))
self.assertTrue(re.search(values, string, re.DOTALL), 'Expected regex "%s" to match on:\n%s' % (values, string))
else:
match_any = any(re.search(o, string) for o in values)
match_any = any(re.search(o, string, re.DOTALL) for o in values)
self.assertTrue(match_any, 'Expected at least one of "%s" to match on:\n%s' % (values, string))
return

Expand Down
2 changes: 2 additions & 0 deletions test/other/test_console_out.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@ int main(int argc, char** argv) {
emscripten_err("this is err");
emscripten_out("this is out");
emscripten_dbg("this is dbg");
emscripten_dbg_backtrace("this is dbg_backtrace");

// Formatting variants
emscripten_errf("this is err: %d", argc);
emscripten_outf("this is out: %d", argc + 1);
emscripten_dbgf("this is dbg: %d", argc + 2);
emscripten_dbg_backtracef("this is dbg_backtrace: %d", argc + 3);

// Length-taking variants
emscripten_errn("hello err", 3);
Expand Down
4 changes: 4 additions & 0 deletions test/other/test_console_out.out
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
this is err
this is out
this is dbg
this is dbg_backtrace
.*
this is err: 1
this is out: 2
this is dbg: 3
this is dbg_backtrace: 4
.*
hel
hell
hello
2 changes: 1 addition & 1 deletion test/test_other.py
Original file line number Diff line number Diff line change
Expand Up @@ -14701,7 +14701,7 @@ def test_proxy_to_worker(self):

@also_with_standalone_wasm()
def test_console_out(self):
self.do_other_test('test_console_out.c')
self.do_other_test('test_console_out.c', regex=True)

@requires_wasm64
def test_explicit_target(self):
Expand Down

0 comments on commit 7d44248

Please sign in to comment.