mirror of
https://github.com/golang/go
synced 2024-11-24 21:00:09 -07:00
http/pprof: fix POST reading bug
R=bradfitz CC=golang-dev https://golang.org/cl/4430075
This commit is contained in:
parent
12cf1699e7
commit
4002014cf8
@ -2880,17 +2880,18 @@ sub FetchSymbols {
|
|||||||
my @toask = @pcs;
|
my @toask = @pcs;
|
||||||
while (@toask > 0) {
|
while (@toask > 0) {
|
||||||
my $n = @toask;
|
my $n = @toask;
|
||||||
if ($n > 49) { $n = 49; }
|
# NOTE(rsc): Limiting the number of PCs requested per round
|
||||||
|
# used to be necessary, but I think it was a bug in
|
||||||
|
# debug/pprof/symbol's implementation. Leaving here
|
||||||
|
# in case I am wrong.
|
||||||
|
# if ($n > 49) { $n = 49; }
|
||||||
my @thisround = @toask[0..$n];
|
my @thisround = @toask[0..$n];
|
||||||
my $t = @toask;
|
|
||||||
print STDERR "$n $t\n";
|
|
||||||
@toask = @toask[($n+1)..(@toask-1)];
|
@toask = @toask[($n+1)..(@toask-1)];
|
||||||
my $post_data = join("+", sort((map {"0x" . "$_"} @thisround)));
|
my $post_data = join("+", sort((map {"0x" . "$_"} @thisround)));
|
||||||
open(POSTFILE, ">$main::tmpfile_sym");
|
open(POSTFILE, ">$main::tmpfile_sym");
|
||||||
print POSTFILE $post_data;
|
print POSTFILE $post_data;
|
||||||
close(POSTFILE);
|
close(POSTFILE);
|
||||||
|
|
||||||
print STDERR "SYMBL!\n";
|
|
||||||
my $url = SymbolPageURL();
|
my $url = SymbolPageURL();
|
||||||
$url = ResolveRedirectionForCurl($url);
|
$url = ResolveRedirectionForCurl($url);
|
||||||
my $command_line = "$CURL -sd '\@$main::tmpfile_sym' '$url'";
|
my $command_line = "$CURL -sd '\@$main::tmpfile_sym' '$url'";
|
||||||
|
@ -26,6 +26,7 @@ package pprof
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"http"
|
"http"
|
||||||
"os"
|
"os"
|
||||||
@ -88,10 +89,14 @@ func Profile(w http.ResponseWriter, r *http.Request) {
|
|||||||
func Symbol(w http.ResponseWriter, r *http.Request) {
|
func Symbol(w http.ResponseWriter, r *http.Request) {
|
||||||
w.Header().Set("Content-Type", "text/plain; charset=utf-8")
|
w.Header().Set("Content-Type", "text/plain; charset=utf-8")
|
||||||
|
|
||||||
|
// We have to read the whole POST body before
|
||||||
|
// writing any output. Buffer the output here.
|
||||||
|
var buf bytes.Buffer
|
||||||
|
|
||||||
// We don't know how many symbols we have, but we
|
// We don't know how many symbols we have, but we
|
||||||
// do have symbol information. Pprof only cares whether
|
// do have symbol information. Pprof only cares whether
|
||||||
// this number is 0 (no symbols available) or > 0.
|
// this number is 0 (no symbols available) or > 0.
|
||||||
fmt.Fprintf(w, "num_symbols: 1\n")
|
fmt.Fprintf(&buf, "num_symbols: 1\n")
|
||||||
|
|
||||||
var b *bufio.Reader
|
var b *bufio.Reader
|
||||||
if r.Method == "POST" {
|
if r.Method == "POST" {
|
||||||
@ -109,14 +114,19 @@ func Symbol(w http.ResponseWriter, r *http.Request) {
|
|||||||
if pc != 0 {
|
if pc != 0 {
|
||||||
f := runtime.FuncForPC(uintptr(pc))
|
f := runtime.FuncForPC(uintptr(pc))
|
||||||
if f != nil {
|
if f != nil {
|
||||||
fmt.Fprintf(w, "%#x %s\n", pc, f.Name())
|
fmt.Fprintf(&buf, "%#x %s\n", pc, f.Name())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wait until here to check for err; the last
|
// Wait until here to check for err; the last
|
||||||
// symbol will have an err because it doesn't end in +.
|
// symbol will have an err because it doesn't end in +.
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
if err != os.EOF {
|
||||||
|
fmt.Fprintf(&buf, "reading request: %v\n", err)
|
||||||
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
w.Write(buf.Bytes())
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user