diff options
author | Siri Hansen <[email protected]> | 2018-11-27 16:55:06 +0100 |
---|---|---|
committer | Siri Hansen <[email protected]> | 2018-11-27 16:55:06 +0100 |
commit | efee45e4381ce1d1fc459e1eb651df8c5b0c03bc (patch) | |
tree | bdde717bbb6a7ff9f822cc7ed6655937c50f7488 /lib/observer | |
parent | 4869ba5939c43cddae487ed5da0951b1d6fbac1e (diff) | |
parent | c9c1efe3815a49eb59ef62e8319cd9f6ea6c67d8 (diff) | |
download | otp-efee45e4381ce1d1fc459e1eb651df8c5b0c03bc.tar.gz otp-efee45e4381ce1d1fc459e1eb651df8c5b0c03bc.tar.bz2 otp-efee45e4381ce1d1fc459e1eb651df8c5b0c03bc.zip |
Merge branch 'siri/cdv/div-bugfixes/OTP-15391' into maint
* siri/cdv/div-bugfixes/OTP-15391:
[cdv] Handle multiple "Yc" lines refering to the same refc binary
[cdv] Speed up reading of dump with many processes
Diffstat (limited to 'lib/observer')
-rw-r--r-- | lib/observer/src/crashdump_viewer.erl | 32 | ||||
-rw-r--r-- | lib/observer/test/crashdump_helper.erl | 18 | ||||
-rw-r--r-- | lib/observer/test/crashdump_viewer_SUITE.erl | 7 |
3 files changed, 40 insertions, 17 deletions
diff --git a/lib/observer/src/crashdump_viewer.erl b/lib/observer/src/crashdump_viewer.erl index 931a869ed6..97bb344cbf 100644 --- a/lib/observer/src/crashdump_viewer.erl +++ b/lib/observer/src/crashdump_viewer.erl @@ -589,9 +589,9 @@ truncated_here(Tag) -> case get(truncated) of true -> case get(last_tag) of - Tag -> % Tag == {TagType,Id} + {Tag,_Pos} -> % Tag == {TagType,Id} true; - {Tag,_Id} -> + {{Tag,_Id},_Pos} -> true; _LastTag -> truncated_earlier(Tag) @@ -846,8 +846,8 @@ do_read_file(File) -> case check_dump_version(Id) of {ok,DumpVsn} -> reset_tables(), - insert_index(Tag,Id,N1+1), - put_last_tag(Tag,""), + insert_index(Tag,Id,Pos=N1+1), + put_last_tag(Tag,"",Pos), DecodeOpts = get_decode_opts(DumpVsn), indexify(Fd,DecodeOpts,Rest,N1), end_progress(), @@ -915,12 +915,10 @@ indexify(Fd,DecodeOpts,Bin,N) -> _ -> insert_index(Tag,Id,NewPos) end, - case put_last_tag(Tag,Id) of - {?proc_heap,LastId} -> - [{_,LastPos}] = lookup_index(?proc_heap,LastId), + case put_last_tag(Tag,Id,NewPos) of + {{?proc_heap,LastId},LastPos} -> ets:insert(cdv_heap_file_chars,{LastId,N+Start+1-LastPos}); - {?literals,[]} -> - [{_,LastPos}] = lookup_index(?literals,[]), + {{?literals,[]},LastPos} -> ets:insert(cdv_heap_file_chars,{literals,N+Start+1-LastPos}); _ -> ok end, @@ -963,10 +961,10 @@ tag(Fd,<<>>,N,Gat,Di,Now) -> check_if_truncated() -> case get(last_tag) of - {?ende,_} -> + {{?ende,_},_} -> put(truncated,false), put(truncated_proc,false); - {?literals,[]} -> + {{?literals,[]},_} -> put(truncated,true), put(truncated_proc,false), %% Literals are truncated. Make sure we never @@ -974,7 +972,7 @@ check_if_truncated() -> %% references literals will show markers for %% incomplete heaps, but will otherwise work.) delete_index(?literals, []); - TruncatedTag -> + {TruncatedTag,_} -> put(truncated,true), find_truncated_proc(TruncatedTag) end. @@ -2867,12 +2865,12 @@ parse_heap_term("Yc"++Line0, Addr, DecodeOpts, D0) -> %Reference-counted binary. SymbolicBin = {'#CDVBin',Start}, Term = cdvbin(Offset, Sz, SymbolicBin), D1 = gb_trees:insert(Addr, Term, D0), - D = gb_trees:insert(Binp, SymbolicBin, D1), + D = gb_trees:enter(Binp, SymbolicBin, D1), {Term,Line,D}; [] -> Term = '#CDVNonexistingBinary', D1 = gb_trees:insert(Addr, Term, D0), - D = gb_trees:insert(Binp, Term, D1), + D = gb_trees:enter(Binp, Term, D1), {Term,Line,D} end; parse_heap_term("Ys"++Line0, Addr, DecodeOpts, D0) -> %Sub binary. @@ -3277,13 +3275,13 @@ tag_to_atom(UnknownTag) -> %%%----------------------------------------------------------------- %%% Store last tag for use when truncated, and reason if aborted -put_last_tag(?abort,Reason) -> +put_last_tag(?abort,Reason,_Pos) -> %% Don't overwrite the real last tag, and don't return it either, %% since that would make the caller of this function believe that %% the tag was complete. put(truncated_reason,Reason); -put_last_tag(Tag,Id) -> - put(last_tag,{Tag,Id}). +put_last_tag(Tag,Id,Pos) -> + put(last_tag,{{Tag,Id},Pos}). %%%----------------------------------------------------------------- %%% Fetch next chunk from crashdump file diff --git a/lib/observer/test/crashdump_helper.erl b/lib/observer/test/crashdump_helper.erl index 576d112154..d5d3649525 100644 --- a/lib/observer/test/crashdump_helper.erl +++ b/lib/observer/test/crashdump_helper.erl @@ -64,6 +64,7 @@ n1_proc(Creator,_N2,Pid2,Port2,_L) -> put(ref,Ref), put(pid,Pid), put(bin,Bin), + put(proc_bins,create_proc_bins()), put(bins,create_binaries()), put(sub_bin,SubBin), put(sub_bins,create_sub_binaries(get(bins))), @@ -119,6 +120,23 @@ create_sub_binary(Bin, Start, LenSub) -> <<_:Start/bytes,Sub:Len/bytes,_/bytes>> = Bin, Sub. +create_proc_bins() -> + Parent = self(), + Pid = + spawn( + fun() -> + %% Just reverse the list here, so this binary is not + %% confused with the one created in n1_proc/5 above, + %% which is used for testing truncation (see + %% crashdump_viewer_SUITE:truncate_dump_binary/1) + Bin = list_to_binary(lists:reverse(lists:seq(1, 255))), + <<A:65/bytes,B:65/bytes,C/bytes>> = Bin, + Parent ! {self(),{A,B,C}} + end), + receive + {Pid,ProcBins} -> ProcBins + end. + %%% %%% Test dumping of maps. Dumping of maps only from OTP 20.2. %%% diff --git a/lib/observer/test/crashdump_viewer_SUITE.erl b/lib/observer/test/crashdump_viewer_SUITE.erl index ed53c46a0d..8c5e618f4a 100644 --- a/lib/observer/test/crashdump_viewer_SUITE.erl +++ b/lib/observer/test/crashdump_viewer_SUITE.erl @@ -400,6 +400,13 @@ special(File,Procs) -> crashdump_viewer:expand_binary({SOffset,SSize,SPos}), io:format(" expand binary ok",[]), + ProcBins = proplists:get_value(proc_bins,Dict), + {['#CDVBin',0,65,ProcBin], + ['#CDVBin',65,65,ProcBin], + ['#CDVBin',130,125,ProcBin]} = ProcBins, + io:format(" ProcBins ok",[]), + + Binaries = crashdump_helper:create_binaries(), verify_binaries(Binaries, proplists:get_value(bins,Dict)), io:format(" binaries ok",[]), |