heap_dump 0.0.18 → 0.0.19
Sign up to get free protection for your applications and to get access to all the features.
- data/ext/heap_dump/heap_dump.c +73 -0
- data/lib/heap_dump/version.rb +1 -1
- metadata +7 -7
data/ext/heap_dump/heap_dump.c
CHANGED
@@ -1437,6 +1437,74 @@ is_pointer_to_heap(void *ptr, void* osp)
|
|
1437
1437
|
return FALSE;
|
1438
1438
|
}
|
1439
1439
|
|
1440
|
+
|
1441
|
+
|
1442
|
+
static int
|
1443
|
+
dump_backtrace(walk_ctx_t *ctx, VALUE file, int line, VALUE method)
|
1444
|
+
{
|
1445
|
+
yg_map();
|
1446
|
+
const char *filename = NIL_P(file) ? "<ruby>" : RSTRING_PTR(file);
|
1447
|
+
|
1448
|
+
ygh_cstring("file", filename);
|
1449
|
+
ygh_int("line", line);
|
1450
|
+
|
1451
|
+
if (NIL_P(method)) {
|
1452
|
+
//fprintf(fp, "\tfrom %s:%d:in unknown method\n", filename, line);
|
1453
|
+
}
|
1454
|
+
else {
|
1455
|
+
//fprintf(fp, "\tfrom %s:%d:in `%s'\n", filename, line, RSTRING_PTR(method));
|
1456
|
+
ygh_rstring("method", method);
|
1457
|
+
}
|
1458
|
+
yg_map_end();
|
1459
|
+
return FALSE;
|
1460
|
+
}
|
1461
|
+
|
1462
|
+
//TODO: autogen, this func is just copied from vm.c
|
1463
|
+
//typedef int rb_backtrace_iter_func(void *, VALUE, int, VALUE);
|
1464
|
+
static int
|
1465
|
+
vm_backtrace_each(rb_thread_t *th, int lev, void (*init)(void *), rb_backtrace_iter_func *iter, void *arg)
|
1466
|
+
{
|
1467
|
+
const rb_control_frame_t *limit_cfp = th->cfp;
|
1468
|
+
const rb_control_frame_t *cfp = (void *)(th->stack + th->stack_size);
|
1469
|
+
VALUE file = Qnil;
|
1470
|
+
int line_no = 0;
|
1471
|
+
|
1472
|
+
cfp -= 2;
|
1473
|
+
while (lev-- >= 0) {
|
1474
|
+
if (++limit_cfp > cfp) {
|
1475
|
+
return FALSE;
|
1476
|
+
}
|
1477
|
+
}
|
1478
|
+
if (init) (*init)(arg);
|
1479
|
+
limit_cfp = RUBY_VM_NEXT_CONTROL_FRAME(limit_cfp);
|
1480
|
+
if (th->vm->progname) file = th->vm->progname;
|
1481
|
+
while (cfp > limit_cfp) {
|
1482
|
+
if (cfp->iseq != 0) {
|
1483
|
+
if (cfp->pc != 0) {
|
1484
|
+
rb_iseq_t *iseq = cfp->iseq;
|
1485
|
+
|
1486
|
+
line_no = rb_vm_get_sourceline(cfp);
|
1487
|
+
file = iseq->filename;
|
1488
|
+
if ((*iter)(arg, file, line_no, iseq->name)) break;
|
1489
|
+
}
|
1490
|
+
}
|
1491
|
+
else if (RUBYVM_CFUNC_FRAME_P(cfp)) {
|
1492
|
+
ID id;
|
1493
|
+
extern VALUE ruby_engine_name;
|
1494
|
+
|
1495
|
+
if (NIL_P(file)) file = ruby_engine_name;
|
1496
|
+
if (cfp->me->def)
|
1497
|
+
id = cfp->me->def->original_id;
|
1498
|
+
else
|
1499
|
+
id = cfp->me->called_id;
|
1500
|
+
if (id != ID_ALLOCATOR && (*iter)(arg, file, line_no, rb_id2str(id)))
|
1501
|
+
break;
|
1502
|
+
}
|
1503
|
+
cfp = RUBY_VM_NEXT_CONTROL_FRAME(cfp);
|
1504
|
+
}
|
1505
|
+
return TRUE;
|
1506
|
+
}
|
1507
|
+
|
1440
1508
|
static void dump_thread(rb_thread_t* th, walk_ctx_t *ctx){
|
1441
1509
|
if(th->stack){
|
1442
1510
|
VALUE *p = th->stack;
|
@@ -1493,6 +1561,11 @@ static void dump_thread(rb_thread_t* th, walk_ctx_t *ctx){
|
|
1493
1561
|
yajl_gen_array_close(ctx->yajl);
|
1494
1562
|
}
|
1495
1563
|
|
1564
|
+
yg_cstring("backtrace");
|
1565
|
+
yg_array();
|
1566
|
+
vm_backtrace_each(th, -1, NULL, dump_backtrace, ctx);
|
1567
|
+
yg_array_end();
|
1568
|
+
|
1496
1569
|
//TODO: mark other...
|
1497
1570
|
ygh_id("first_proc", th->first_proc);
|
1498
1571
|
if (th->first_proc) ygh_id("first_proc", th->first_args);
|
data/lib/heap_dump/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: heap_dump
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.19
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-06-12 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: ruby-internal
|
16
|
-
requirement: &
|
16
|
+
requirement: &70355842922720 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 0.8.5
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70355842922720
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: yajl-ruby
|
27
|
-
requirement: &
|
27
|
+
requirement: &70355842921720 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '1.1'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70355842921720
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rake-compiler
|
38
|
-
requirement: &
|
38
|
+
requirement: &70355842920780 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70355842920780
|
47
47
|
description: dump ruby 1.9 heap contents
|
48
48
|
email:
|
49
49
|
- vasilyfedoseyev@gmail.com
|