Commit 4002014c authored by Russ Cox's avatar Russ Cox

http/pprof: fix POST reading bug

R=bradfitz
CC=golang-dev
https://golang.org/cl/4430075
parent 12cf1699
...@@ -2880,17 +2880,18 @@ sub FetchSymbols { ...@@ -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 ...@@ -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) { ...@@ -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) { ...@@ -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())
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment