From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51723) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YE2fd-0001Ms-OY for qemu-devel@nongnu.org; Wed, 21 Jan 2015 16:18:42 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YE2fW-0002WG-Ut for qemu-devel@nongnu.org; Wed, 21 Jan 2015 16:18:37 -0500 Received: from mx1.redhat.com ([209.132.183.28]:48526) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YE2fW-0002W5-NZ for qemu-devel@nongnu.org; Wed, 21 Jan 2015 16:18:30 -0500 From: Wei Huang Date: Wed, 21 Jan 2015 16:15:31 -0500 Message-Id: <1421874931-4143-4-git-send-email-wei@redhat.com> In-Reply-To: <1421874931-4143-1-git-send-email-wei@redhat.com> References: <1421874931-4143-1-git-send-email-wei@redhat.com> Subject: [Qemu-devel] [PATCH 3/3] kvm_stat: Print errno when syscall to perf_event_open() fails List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: peter.maydell@linaro.org, pbonzini@redhat.com kvm_stat uses syscall() to call perf_event_open(). If this function call fails, the returned value is -1, which doesn't tell the details of such failure (i.e. ENOSYS or EINVAL). This patch retrieves errno and prints it when syscall() fails. The error message will look like "Exception: perf_event_open failed, errno = 38". Signed-off-by: Wei Huang --- scripts/kvm/kvm_stat | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/scripts/kvm/kvm_stat b/scripts/kvm/kvm_stat index e8b3295..f5f1c58 100755 --- a/scripts/kvm/kvm_stat +++ b/scripts/kvm/kvm_stat @@ -13,6 +13,7 @@ import curses import sys, os, time, optparse, ctypes +from ctypes import * class DebugfsProvider(object): def __init__(self): @@ -247,6 +248,9 @@ import struct, array libc = ctypes.CDLL('libc.so.6') syscall = libc.syscall +get_errno = libc.__errno_location +get_errno.restype = POINTER(c_int) + class perf_event_attr(ctypes.Structure): _fields_ = [('type', ctypes.c_uint32), ('size', ctypes.c_uint32), @@ -330,7 +334,8 @@ class Event(object): group_leader = group.events[0].fd fd = _perf_event_open(attr, -1, group.cpu, group_leader, 0) if fd == -1: - raise Exception('perf_event_open failed') + err = get_errno()[0] + raise Exception('perf_event_open failed, errno = ' + err.__str__()) if filter: import fcntl fcntl.ioctl(fd, ioctl_numbers['SET_FILTER'], filter) -- 1.8.3.1